递归函数:在定义一个函数的过程中直接或间接地调用了被定义的函数本身。自己调用自己
-
公式递归问题
能够使用一个递归公式描述的问题可归类为公式递归问题。公式递归问题实现起来比较容易,只要给出了递归公式,就能够直观地编写递归函数。求解公式递归问题的步骤。
用递归公式描述问题
将递归公式函数化
问题一:
设累加和用函数sum(n)表示:
当n=1时,sum(n)=1
当(n>1)时 sum(n-1)+n
- 将递归公式函数化
上述递归公式给出了sum(n)的两种取值,即:n为1时,其值为1;n>1时,其值为sum(n-1)+n。由此,定义递归函数:
标准代码如下:
#include<stdio.h>
void main(){
long sum(int);
int n;
printf("n=");
scanf("%d",&n);
printf("Sum=%ld\n",sum(n));
}
long sum(int n)
{
if(n==1)
return 1;
else
return sum(n-1)+n;
}
运算结果:
这是调用函数
再次强调:int main()与void main()的区别
带有int 的需要返回retrun
void则是printf();
如输入10
sum(9)+10
判断9不等于1,
sum(10-1)+10
sum(9-1)+9
sum(8-1)+8
sum(7-1)+7
sum(6-1)+6
sum(5-1)+5
sum(4-1)+4
sum(3-1)+3
sum(2-1)+2
1
最后的结果是55
适合做重复的动作
非公式递归问题
有的问题不能直接用一个递归公式进行描述,但可以用递归方法进行描述,我们将其归类为非公式递归问题。
问题二:
有三个柱子和n个大小各不相同的盘子。开始时,所有盘子以他装叠放在柱A上,要求按一定规则,将柱A上的所有盘子移动到柱B上,柱C为移动缓冲柱。移动规则:
一次只能移动一个盘子
任何时候不能把盘子放在比它小的盘子上面
汉诺塔问题的递归描述:
hanoi(n个盘,A->B,缓柱C){
if(n==1)
直接从A移动到B
}else{
hanoi(n-1个盘,A->C,缓柱B)
移动n号盘子:
A->B
hanio(n-1个盘,C->B,缓柱A)
}
#include<stdio.h>
int main(){
int disks;
void hanoi(int,char,char,char);
printf("Number of disks");
scanf("%d",&disks);
printf("\n");
hanoi(disks, 'A', 'B', 'C');
}
void hanoi(int n,char A,char B,char C){
if(n==1)
printf("%c-->%c",A,B);
else{
hanoi(n-1,A,C,B);
printf("%c-->%c",A,B);
hanoi(n-1,C,B,A);
}
}