函数自己调用自己,这个过程就叫函数递归。
要点:
递归函数必须包含能够让递归调用停止的语句,或者是能够使用递归的条件。也就是到达一定条件后,嵌套的结果将不会继续调用本函数。
#include <stdio.h>
void up_and_down(int);
int main()
{
up_and_down(1);
getchar();
return 0;
}
void up_and_down(int n)
{
printf("Level %d: n 的 location 是 %p\n ", n, &n);
if (n < 4)
up_and_down(n + 1);
printf("LEVEL %d: n 的 location 是 %p\n ", n, &n);//这里不理解……为了安抚深究的心情,先这样认为吧,在结束递归调用后,在看不到的地方它逐级将n的递归效果传回了它的主调函数main,不过,这个功能刚好可以用来求进制
}
1、求n的阶乘(n ∈ N*)。
数学公式:n!=
代码实现:
#include <stdio.h>
int F(int n);
int main()
{
int m,n;
scanf_s("%d", &n);
m = F(n);
printf("%d!=%d",n, m);
return 0;
}
int F(int n) {
//int i=1;
if (n == 1)
//i = 1;
return 1;//没有继续嵌套,也就是上面的if是结束嵌套的条件
else
//i=n*F(n-1);
return n * F(n - 1);//一层一层的递减嵌套F(x)相乘
//return i;
}
2、Fibonacci数列
斐波那契数列,即每个数都是它的前两个数之和。
递推的方法定义为:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2),( n ≥ 2,n ∈ N*)
假如我要求第7个Fibonacci数:
数学关系:f(n)=
代码实现:
#include <stdio.h>
int F(int n);
int main()
{
int n;
scanf_s("%d", &n);
//m = F(n);
printf("第%d个数=%d",n, F(n));
return 0;
}
int F(int n) {
if ((n == 1)||(n == 2))
return 1;
else
return F(n-1)+F(n-2);
}
3、打印一个正整数的的二进制数。
(1)常规计算中,我们将整数除2求余,直到所得商小于2后再逆向将所得余数组合得二进制。
(2)在二进制的转换中,奇数的末尾一定是1,偶数的末尾一定是0
#include <stdio.h>
int Binary(int n);
int main()
{
int num;
scanf_s("%d", &num);
Binary(num);
return 0;
}
int Binary(int n) {
int r;
r = n % 2;
if (n >= 2)
Binary(n / 2);
printf("%d", r);
//putchar(r == 0 ? "0" : "1");
return;
}
4、求一个一维数组内元素的和。
#include <stdio.h>
int F(int a[],int L,int R);
int main()
{
int a[] = {5,6,9,3,7};
int b;
b = F(a, 0, 4);//0到4的五个位置
printf("%d", b);
return 0;
}
int F(int a[], int L, int R) {
if (L == R)
return a[L];
else
{
return a[L] + F(a, L + 1, R);
}
}