一、累加问题
使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。
1.输入数字
int addTo(int paraN) {
int tempSum;
printf("entering addTo(%d)\r\n",paraN);
if(paraN<=0){
printf(" 请你输入正确的数字\r\n");
return 0;
} else{
tempSum = addTo(paraN -1)+paraN;
printf(" return %d\r\n",tempSum);
return tempSum;
} // Of if
}// Of addTo
2.测试代码
void addToTest() {
int n,sum;
printf("---- addToTest begins. ----\r\n");
n = 5;
sum=addTo(n);
printf("\r\n0 adds to %d gets %d.\r\n",n,sum);
n=1;
sum=addTo(n);
printf("\r\n0 adds to %d gets %d.\r\n",n,sum);
n=-1;
sum=addTo(n);
printf("\r\n0 adds to %d gets %d.\r\n",n,sum);
printf("----addToTest ends. ----\r\n");
}// Of addToTest
/**
The entrance.
*/
int main() {
addToTest();
}// Of main
3.完整代码
#include <stdio.h>
/**
* Recursive addition.
*/
int addTo(int paraN) {
int tempSum;
printf("entering addTo(%d)\r\n",paraN);
if(paraN<=0){
printf(" 请你输入正确的数字\r\n");
return 0;
} else{
tempSum = addTo(paraN -1)+paraN;
printf(" return %d\r\n",tempSum);
return tempSum;
} // Of if
}// Of addTo
/**
*A clear version.
*/
int clearAddTo(int paraN) {
if(paraN<=0){
return 0;
} else{
return clearAddTo(paraN-1)+paraN;
}// Of if
} // Of clearAddTo
/**
*Test the addTo function.
*/
void addToTest() {
int n,sum;
printf("---- addToTest begins. ----\r\n");
n = 5;
sum=addTo(n);
printf("\r\n0 adds to %d gets %d.\r\n",n,sum);
n=1;
sum=addTo(n);
printf("\r\n0 adds to %d gets %d.\r\n",n,sum);
n=-1;
sum=addTo(n);
printf("\r\n0 adds to %d gets %d.\r\n",n,sum);
printf("----addToTest ends. ----\r\n");
}// Of addToTest
/**
The entrance.
*/
int main() {
addToTest();
}// Of main
4.运行结果
---- addToTest begins. ----
entering addTo(5)
entering addTo(4)
entering addTo(3)
entering addTo(2)
entering addTo(1)
entering addTo(0)
请你输入正确的数字
return 1
return 3
return 6
return 10
return 15
0 adds to 5 gets 15.
entering addTo(1)
entering addTo(0)
请你输入正确的数字
return 1
0 adds to 1 gets 1.
entering addTo(-1)
请你输入正确的数字
0 adds to -1 gets 0.
----addToTest ends. ----
二、汉诺塔问题
汉诺塔问题简述:有三根柱子,编号分别为a,b,c,a柱子自下而上、由大到小按顺序放置n个圆盘,实现将a柱上的圆盘全部移到c柱上,并仍保持原有顺序叠好。移动规则:每次只能移动一个圆盘,并且在移动过程中三根柱上都始终保持大盘在下,小盘在上,移动过程中圆盘可以置于a,b,c任一根柱子上。
解题思想:
(1)以c柱为中介,先将n-1个圆盘按规则从a柱移动到b柱上;
(2)将最底层的圆盘移动到c柱上;
(3)以a柱为中介,将b柱上的n-1个圆盘按规则移动到c柱上。
c语言简单实现如下:
#include <stdio.h>
void main()
{
void move(char, char);//移动盘子
void TowerOfHanoi(int, char, char, char);//汉诺塔函数
int n;
char t1 = 'a', t2 = 'b', t3 = 'c';
printf("input the number of plates:");
scanf("%d", &n);
printf("the results are as follows:\n");
TowerOfHanoi(n, t1, t2, t3);
}
void TowerOfHanoi(int m, char t1, char t2, char t3)
{
//圆盘数目m,圆柱 t1,t2,t3
void move(char x, char y);
if(m == 1)
move(t1, t3);
else
{
TowerOfHanoi(m-1, t1, t3, t2);//将m-1个圆盘从t1移动到t2
move(t1, t3);//将最底层的圆盘移动到t3
TowerOfHanoi(m-1, t2, t1, t3); //将m-1个圆盘从t2移动到t3
}
}
void move(char x, char y)
{
printf("%c-->%c\n", x, y);
}
运行结果
请输入盘子的数量:3
结果如下:
a-->c
a-->b
c-->b
a-->c
b-->a
b-->c
a-->c