递归的概念不赘述了。
这里有几个递归的基础题,简单分析一波
简单递归【2】会有一个Hanoi塔问题的解析!
敬请期待!
阶乘我们之前用循环写过了,代码大概是这样的
#include<stdio.h>
int main(){
int n,result,i;
scanf("%d",&n);
result=1;
for(i=1;i<=n;i++){
result=result*i;
}
printf("%d",result);
return 0;
}
这里呢,可以将循环用一个递归函数来替代
写递归函数时需要找到递归出口以及由前式递推的关系
出口一般是很明显的状态,可以有它推出其他各项
这里的出口很显然是n==1时返回1了
那么关系式呢?
上面已经说了
当n!=1时n的阶乘就等于n*(n-1)!
想到这里代码就可以写出来了,不过有些同学想要弄清楚执行过程可以简单手推一下。
不过这里建议,手推在理解递归时有一定帮助,不过后续还是不要试图过于深入地理解太复杂的关系。会把脑子搞坏!
到这里就可以上代码了
#include<stdio.h>
unsigned fac(int n){//这里unsinged是考虑了阶乘过大的情况
unsigned result;
if(n==0){//出口
result=1;
}
else{
result=n*fac(n-1);//减治递归?是这个说法吧
}
return result;
}
int main(){//主函数
unsigned n;
scanf("%d",&n);
printf("%d",fac(n));
return 0;
}
斐波拉契数列与上面的不同是在自身里面调用了两次自身
老规矩,贴循环代码
#include<stdio.h>
int main(){
int n,fb1,fb2,fb,i;
scanf("%d",&n);
fb1=1;
fb2=1;
for(i=3;i<=n;i++){
fb=fb1+fb2;
fb1=fb2;
fb2=fb;
}
printf("%d",fb);
return 0;
}
与上面对应
出口:
n==1-->1
n==2-->1
关系fb=f(n-1)+f(n-2)
依此写出代码
#include<stdio.h>
unsigned fibo(unsigned n){
unsigned result;
if(n==1){
return 1;
}
else if(n==2){
return 1;
}
else{
result=fibo(n-1)+fibo(n-2);
return result;
}
}
int main(){
unsigned n;
scanf("%u",&n);
printf("%u",fibo(n));
}
好啦!
这里呢有一道题
可以试着做一下
加油
ps:立flag!!写Hanoi塔问题分析、BF算法、还有几个多维数组的题解!整理一下吧!
晚安!!!