✨个人主页: 熬夜学编程的小林
系列专栏: 【C语言详解】 【数据结构详解】
函数递归
1、递归是什么?
1.1、递归的思想:
1.2、递归的限制条件
2、递归举例
2.1、举例1:求n的阶乘
2.1.1、分析和代码实现
2.1.2、画图推演
2.2、举例2:顺序打印⼀个整数的每⼀位
2.2.1、分析和代码实现
2.2.2、画图推演
3、递归与迭代
3.1、举例3:求第n个斐波那契数
总结
#include
int main()
{
printf("hehe\n");
main();//main函数中又调用了main函数
return 0;
}
把⼀个大型复杂问题层层转化为⼀个与原问题相似,但规模较小的子问题来求解;直到子问题不能再被拆分,递归就结束了。所以递归的思考方式就是把 大事化小的过程。
• 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。• 每次递归调用之后越来越接近这个限制条件。
举例:
5! = 5*4*3*2*1
4! = 4*3*2*1
所以:5! = 5*4!
int Fact(int n)
{
if(n==0)
return 1;
else
return n*Fact(n-1);
}
#include
int Fact(int n)
{
if(n==0)
return 1;
else
return n*Fact(n-1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fact(n);
printf("%d\n", ret);
return 0;
}
如果n是⼀位数,n的每⼀位就是n自己;n是超过1位数的话,就得拆分每⼀位。
Print(n)
如果n是1234,那表示为
Print(1234) //打印1234的每⼀位
其中1234中的4可以通过%10得到,那么
Print(1234)就可以拆分为两步:
1. Print(1234/10) //打印123的每⼀位
2. printf(1234%10) //打印4
完成上述2步,那就完成了1234每⼀位的打印
那么Print(123)⼜可以拆分为Print(123/10) + printf(123%10)
Print(1234)
==>Print(123) + printf(4)
==>Print(12) + printf(3)
==>Print(1) + printf(2)
==>printf(1)
那么代码完成也就比较清楚:
void Print(int n)
{
if(n>9)
{
Print(n/10);
}
printf("%d ", n%10);
}
int main()
{
int m = 0;
scanf("%d", &m);
Print(m);
return 0;
}
int Fact(int n)
{
if(n==0)
return 1;
else
return n*Fact(n-1);
}
int Fact(int n)
{
int i = 0;
int ret = 1;
for(i=1; i<=n; i++)
{
ret *= i;
}
return ret;
}
int Fib(int n)
{
if(n<=2)
return 1;
else
return Fib(n-1)+Fib(n-2);
}
#include
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
#include
int count = 0;
int Fib(int n)
{
if(n == 3)
count++;//统计第3个斐波那契数被计算的次数
if(n<=2)
return 1;
else
return Fib(n-1)+Fib(n-2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
printf("\ncount = %d\n", count);
return 0;
}
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;
}
本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!