定义:
一个函数直接或间接的调用自己
一个函数为什么可以自己调用自己?
递归满足三个条件
1. 递归必须有一个明确的终止条件
2. 该函数所处理的数据规模必须在递减
3. 这个转化必须是可解的
举例:
1. 求阶乘
2. 1+2+3+4...+100的和
3. 汉诺塔
4. 走迷宫
循环和递归
递归:
易于理解
速度慢
储存空间大
循环:
不易理解
速度快
储存空间小
递归的应用
树和森林就是以递归的方式定义的
树和图的很多算法都是以递归实现的
很多数学公式就是以递归的方式定义的
#include<stdio.h>
void f(int n){
if(n=1)
printf("haha\n");
else
f(n-1);
}
int main(void){
f(3);
return 0;
}
求n的阶乘
1.循环的方法
#include<stdio.h>
int main(void){
int n,mult=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
mult=mult*i;
}
printf("%ld",mult);
}
递归的方法
#include<stdio.h>
long f(int n){
if(1==n)
return 1;
else
return f(n-1)*n;
}
int main(void){
printf("%d",f(6));
return 0;
}
求前100项的和
#include<stdio.h>
long sum(int n){
if(1==n)
return 1;
else
return sum(n-1)+n;
}
int main(void){
printf("%ld",sum(100));
}
汉诺塔
#include<stdio.h>
char hannuota(int n,char a,char b,char c){
if(n==1)
{
printf("将编号为%d的盘子,直接从%c柱子移到%c柱子上\n",n,a,c);
}
else
{
hannuota(n-1,a,c,b);
printf("将编号为%d的盘子,直接从%c柱子移到%c柱子上\n",n,a,c);
hannuota(n-1,b,a,c);
}
}
int main(void){
char ch1='A';
char ch2='B';
char ch3='C';
int n;//盘子的个数
scanf("%d",&n);
hannuota(n,'A','B','C') ;
return 0;
}