一、累加
代码
累加是最简单的一种递归,先通过累加理解递归
#include<stdio.h>
#include<malloc.h>
//累加
int addTo(int n){
int num;
if(n<=0){
num=0;
}
else{
num=addTo(n-1)+n;
}
return num;
}
int main(){
int n,sum;
scanf("%d",&n);
sum=addTo(n);
printf("%d",sum);
}
运行结果
5
add(1)=add(0)+1
add(2)=add(1)+2
add(3)=add(2)+3
add(4)=add(3)+4
add(5)=add(4)+5
15
我将递归的过程打印了出来,可以看到递归的本质就是调用自身,直到找到递归出口结束递归。
二、斐波那契数列
int Fib(int n){
int num;
if(n==1||n==2){
num=1;
}
else{
num=Fib(n-1)+Fib(n-2);
}
return num;
}
int main(){
int n,sum;
scanf("%d",&n);
sum=Fib(n);
printf("%d",sum);
}
运行结果
7
13
三、汉诺塔问题
int Hanoi(int n,char A,char B,char C){
//将n个圆盘由A到C,B做辅助塔
if(n==0){
return 1;
}
Hanoi(n-1,A,C,B);
printf("%c->%c\n",A,C);
Hanoi(n-1,B,A,C);
}
int main(){
int n;
scanf("%d",&n);
char source='A',Assist='B',Target='C';
Hanoi(n,source,Assist,Target);
}
运行结果
3
A->C
A->B
C->B
A->C
B->A
B->C
A->C
四、遍历输出链表中各个结点的递归算法
链表中指针域next是一个指向下一个结点的指针,故结点的定义中又用到了其自身,所以链表是一种递归的数据结构
void printNode(LinkList p){
if(p==NULL){
return;
}
else{
printf("p->data");
printNode(p->next);
}
}
总结
对于简单的累加计算,用递归并不能看出优势,但对于一些复杂问题,递归能将复杂的问题分解成几个相对简单且解法相同的子问题来求解。
递归求解必须具备的条件:
1、能将一个问题转化成一个新问题,而新问题的与原问题的解法相同或类同,不同的仅是处理对象,并且这些处理对象更小且变化有规律
2、可以通过上述转化使问题更简化
3、必须有一个明确的递归出口
递归在我们处理实际问题时并不常用,但理解递归的思想非常重要