递归函数:
- 定义:将一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
- 满足条件:①函数自己调自己(存在死递归的缺陷)
②必须有函数的退出条件才能返回
③递归思想:将大的问题规模不断缩小直至最小的问题规模(大事化小小事化了)
主要体现在:形参上控制问题规模
最小规模:我们自己可以直接处理的问题
eg死递归:
void fun()
{
fun();
}
3.例题:
- 递归算法求和
Getsum(5)
Getsum(4)+5 ;
Getsum(3)+4 ;
Getsum(2)+3 ;
Getsum(1)+2 ;
int Getsum(int n)
{
if (n == 1)
{
return 1;
}
int Getsum(n - 1) + n;// 问题规模不断缩小的过程
return sum;
}
int main()
{
int res=Getsum(5);
printf(“%d”,res);
return 0;
}
函数值返回给上一步的调用处,最后一步把值返回给main函数
2.递归求阶乘
//递归求n的阶乘
#include<stdio.h>
#include<math.h>
int GetMul(int n)
{
if (n == 1)
{
return 1;
}
int Mul=GetMul(n - 1)* n;
return Mul;
}
int main()
{
int res = GetMul(5);//100的阶乘求不出来(栈溢出)
printf("%d", res);
return 0;
}
3. //求斐波那契数列第n项的值
// 1 1 2 3 5 8 13
int Fabonic(int n)
{
if ( n == 1||n==2 )
{
return 1;
}
return Fabonic(n - 1) + Fabonic(n-2);
}
int main()
{
int res=Fabonic(8);
printf("%d",res );
return 0;
}
4.拓展
/*青蛙(Frog)跳台阶问题:一只青蛙可以一次跳一级台阶,或一次跳两级台阶
问跳上n级台阶有几种跳法?
1个台阶1一种;2个台阶有两种;3个台阶有三种;
1 2 3 5 8 (斐波那契数列的变换)
*/
int Frog(int n)
{
if (n == 1)
{
return 1;
}
if (n == 2)
{
return 2;
}
return Frog(n - 1) + Frog(n - 2);
}
int main()
{
int res = Frog(4);
printf("%d", res);
return 0;
}