递归是一项重要的编程技术,它让函数可以从函数体内部调用自身。递归通常把一个大型复杂的问题层层简化为一个,与原问题相似的规模较小的问题来求解,使用递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,这样就大大地减少了程序的代码量。但是使用递归的时候需要消耗较多的栈空间,所以递归次数过多容易造成栈溢出等。在堆栈尺寸受到限制的时候 ,一般需要避免使用递归。
用递归实现一个给定数的阶乘。
#include
double factorial(unsigned int i);
int main(){
unsigned int i = 5;
printf("%d 的阶乘为 %lf\n", i, factorial(i));
return 0;
}
double factorial(unsigned int i){
if(i <= 1){
return 1;
}
return i * factorial(i - 1);
}
运行结果:
#include
int fibonaci(int i);
int main(){
int i;
for(i = 0; i < 10; i++){
printf("%d\t\n", fibonaci(i));
}
return 0;
}
int fibonaci(int i){
if(i == 0){
return 0;
}
if(i == 1){
return 1;
}
return fibonaci(i - 1) + fibonaci(i - 2);
}
运行结果:
解:(1)n == 1
第1次 1号盘 A---->C sum = 1 次
(2) n == 2
第1次 1号盘 A---->B
第2次 2号盘 A---->C
第3次 1号盘 B---->C sum = 3 次
(3)n == 3
第1次 1号盘 A---->C
第2次 2号盘 A---->B
第3次 1号盘 C---->B
第4次 3号盘 A---->C
第5次 1号盘 B---->A
第6次 2号盘 B---->C
2个圆盘的次数 2的2次方减1
3个圆盘的次数 2的3次方减1
。 。 。 。 。 。
#include
void Move(char x, char y){
printf("%c -> %c\n", x, y);
}
void Hanoi(int n, char one, char two, char three){
if(1 == n){
Move(one, three);
}
else{
Hanoi(n - 1, one, three, two);
Move(one, three);
Hanoi(n - 1, two, one, three);
}
}
int main(){
void Hanoi(int n, char one, char two, char three);
int m;
printf("input the number of disks:");
scanf("%d", &m);
printf("The step to move %d diskes:\n", m);
Hanoi(m, 'A', 'B', 'C');
}