1.递归
递归就是把一个大问题不断拆分为子问题, 直到子问题可以直接解决的地步
构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
代码
#include <stdio.h>
/**
* Recursive addition.
*/
int addTo(int paraN) {
int tempSum;
printf("entering addTo(%d)\r\n", paraN);
if (paraN <= 0) {
printf(" return 0\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.
*/
void main() {
addToTest();
}// Of main
2.汉诺塔
汉诺塔采用的是递归的方式,要移动n个物体就先移动n-1个物体,以此类推
代码
#include <iostream>
#define NUM 4
using namespace std;
void HanoiTower(int num, char src, char tmp, char dst); // 汉诺塔移动算法(递归)
int times = 0; // 全局变量,储存搬运次数
// 主函数
int main()
{
cout << "需要移动的金盘数量:" << NUM << endl;
HanoiTower(NUM, 'A', 'B', 'C');
cout << "一共需要移动:" << times << "次" << endl;
while (1);
return 0;
}
// 汉诺塔移动算法(递归)
// num:圆盘数量 src:源塔 tmp:临时塔 dst:目标塔
void HanoiTower(int num, char src, char tmp, char dst)
{
//如果圆盘数量为1,直接将金盘从源塔移动至目标塔
if (num == 1)
{
cout << src << "-->" << dst << endl;
times++;
return;
}
//如果圆盘数量大于1,将最底下的那个金盘视为一部分,其上所有的金盘视为另一部分(整体当做一个金盘来看待,以下称为 “整体盘”)
//将整体盘从源塔移动到临时塔
HanoiTower(num - 1, src, dst, tmp);
//将源塔中仅剩的金盘移动到目标塔
HanoiTower(1, src, tmp, dst);
//将整体盘从临时塔移动到目标塔
HanoiTower(num - 1, tmp, src, dst);
}
结果