目录
1.递归是什么?
1.1 递归的思想:
2.顺序打印⼀个整数的每⼀位
编辑3 迭代
4.求第n个斐波那契数
1.递归是什么?
递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。
#include <stdio.h>
int main()
{
printf("哈哈\n");
main();//自己调用自己,结果就是死循环打印哈哈
return 0;
}
1.1 递归的思想:
所以递归的思考⽅式就是把⼤事化⼩的过程。 递归中的递就是递推的意思,归就是回归的意思,接下来慢慢来体会。
计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。
#include <stdio.h>
int func(int n)
{
if (n == 0)//1的阶乘是0;
return 1;
else
return n * func(n - 1);//套用公式
}
int main()
{
int n = 0;
scanf("%d", &n);
int r = func(n);
printf("%d ", r);
return 0;
}
上面图很好的解释了上面代码
在C语⾔中每⼀次函数调⽤,都需要为本次函数调⽤在内存的栈区,申请⼀块内存空间来保存函数调 ⽤期间的各种局部变量的值,这块空间被称为运⾏时堆栈,或者函数栈帧。
2.顺序打印⼀个整数的每⼀位
输⼊:1234 输出:1 2 3 4
输⼊:520 输出:5 2 0
这个题⽬,放在我们⾯前,⾸先想到的是,怎么得到这个数的每⼀位呢? 如果n是⼀位数,n的每⼀位就是n⾃⼰ n是超过1位数的话,就得拆分每⼀位 1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4 然后继续对123%10,就得到了3,再除10去掉3,以此类推 不断的 %10 和 /10 操作,直到1234的每⼀位都得到;
#include <stdio.h>
void Print(int n)
{
if (n > 9)
Print(n /10);
printf("%d ", n % 10);//调用完后才打印
}
int main()
{
int n = 0;
scanf("%d", &n);
Print(n);
return 0;
}
3 迭代
#include <stdio.h>
int func(int n)//用迭代的方法写出n的阶乘
{
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
return ret;
}
int main()
{
int n = 0;
scanf("%d", &n);
int r = func(n);
printf("%d ", r);
return 0;
}
4.求第n个斐波那契数
看到这公式,很容易诱导我们将代码写成递归的形式
#include <stdio.h>
int func(int n)
{
if (n <= 2)
return 1;
else
return func(n - 1) + func(n - 2);//这个代码计算比较小的数值还可以,但是到了五十的斐波那契就显得困难了
}
int main()
{
int n = 0;
scanf("%d", &n);
int r = func(n);
printf("%d ",r);
return 0;
}
当算到第50个斐波那契数列就显得非常吃力了,那是由于什么原因呢?下面来看一张图就能帮助你理解。
其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计 算,⽽且递归层次越深,冗余计算就会越多
用迭代的方式来写
#include <stdio.h>
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d",&n);
int r = Fib(n);
printf("%d ", r);
return 0;
}
迭代的⽅式去实现这个代码,效率就要⾼出很多了