1、累加的递归实现
递归算法解决问题的特点:
1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
代码:
#include<stdio.h>
int Add(int n){
int sum;
if(n <= 0)
{
printf("return 0\n");
return 0;
}
else
{
sum = Add(n-1)+n;
printf("return %d\n",sum);
return sum;
}
}
void AddTest(){
int n, sum;
printf("---- AddTest begins. ----\n");
n = 5;
sum = Add(n);
printf("\n0 adds to %d gets %d.\n", n, sum);
printf("\n");
n = 1;
sum = Add(n);
printf("\n0 adds to %d gets %d.\n", n, sum);
printf("\n");
n = -1;
sum = Add(n);
printf("\n0 adds to %d gets %d.\n", n, sum);
printf("\n");
n = 15;
sum = Add(n);
printf("\n0 adds to %d gets %d.\n", n, sum);
printf("\n");
printf("---- AddTest ends. ----\n");
}
int main(){
AddTest();
return 0;
}
运行结果:
---- AddTest begins. ----
return 0
return 1
return 3
return 6
return 10
return 15
0 adds to 5 gets 15.
return 0
return 1
0 adds to 1 gets 1.
return 0
0 adds to -1 gets 0.
return 0
return 1
return 3
return 6
return 10
return 15
return 21
return 28
return 36
return 45
return 55
return 66
return 78
return 91
return 105
return 120
0 adds to 15 gets 120.
---- AddTest ends. ----
2、汉诺塔问题
汉诺塔问题简述:有三根柱子,编号分别为A,B,C,A柱子自下而上、由大到小按顺序放置n个圆盘,实现将A柱上的圆盘全部移到C柱上,并仍保持原有顺序叠好。移动规则:每次只能移动一个圆盘,并且在移动过程中三根柱上都始终保持大盘在下,小盘在上,移动过程中圆盘可以置于A,B,C任一根柱子上。
解题思想:
(1)以C柱为中介,先将n-1个圆盘按规则从A柱移动到B柱上;
(2)将最底层的圆盘移动到C柱上;
(3)以A柱为中介,将B柱上的n-1个圆盘按规则移动到C柱上。
代码:
#include <stdio.h>
void hanoi(int paraN, char paraSource, char paraDestination, char paraTransit) {
if (paraN <= 0)
{
return;
}
else
{
hanoi(paraN - 1, paraSource, paraTransit, paraDestination);
printf("%c -> %c \n", paraSource, paraDestination);
hanoi(paraN - 1, paraTransit, paraDestination, paraSource);
}
}
void hanoiTest(){
printf("---- begins. ----\n");
printf("2 plates\n");
hanoi(2, 'A', 'B', 'C');
printf("3 plates\n");
hanoi(3, 'A', 'B', 'C');
printf("4 plates\n");
hanoi(4, 'A', 'B', 'C');
printf("5 plates\n");
hanoi(5, 'A', 'B', 'C');
printf("---- ends. ----\n");
}
void main(){
hanoiTest();
}
运行结果:
---- begins. ----
2 plates
A -> C
A -> B
C -> B
移动次数:3
3 plates
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
移动次数:7
4 plates
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
A -> B
C -> B
C -> A
B -> A
C -> B
A -> C
A -> B
C -> B
移动次数:15
5 plates
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
A -> C
B -> C
B -> A
C -> A
B -> C
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
C -> A
B -> C
B -> A
C -> A
C -> B
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
移动次数:31
---- ends. ----