二、递归(2个经典例题)
递归核心:终止条件 + 递推公式
1.定义:函数的自我调用,自己调用自己,每次调用都会逼近临结条件,知道达到条件为止。
例:int main()
{ printf(“haha”);
main();
return 0;
}
因为没有临界条件,它会不停打印haha
2.递归的限制:有限制条件
向条件靠近
3.公式类题型:翻译公式+判断是否存在特殊项需要单独存放
4.递归一般可以用循环代替,有时循环的效果更好
5.如果无限递归,会出现栈溢出的情况
6.递归时函数自己调用自己,所以一定要设函数。
比如:int func(int a)
{
if()
{
return x;
}
return func(m);}
7.一般题型
顺序打印(如果不用递归就要用数组)
求阶层:公式
斐波那契数列:公式
青蛙跳阶问题:先分清最后到底要多少步才能跳上去,再往回反推。fact=fact(n-k1)+fact(n-k2);
汉若塔:void hanoi(int n, start, temp, desd)
{
if(n == 1)
{
printf(“%c → %c\n”,a,c);
return;
}
hanoi(n-1,a,c,b); //把n-1个从a移到b,c辅助
printf(“%c → %c\n”,a,c);
hanoi(n-1,b,a,c); //把n-1个从b移到c,a辅助
}
逻辑:
- n==1,直接移动,递归出口
- 先把上面n-1盘子移到中转柱
- 移动最底下最大圆盘到目标
- 再把n-1个从中转移到目标