目录
一 概述
递归是一种很适合计算机的实现方式,在计算机内部是使用栈来实现的,递归的优点是空间复杂性比价低,代码短。但是也有一定的缺点,就是并不是那么高效(时间上),以及并不适合并行化,汉诺塔还是很有意思的一个代码(虽然我一直在被他摧残)
二 代码
2.1 累加代码
#include<stdio.h>
#include<stdlib.h>
//累加的递归形式
int add(int num) {
if (num == 1)
return 1;
else{
return num + add(num - 1);
}
}
int main() {
int number;
printf("请输入累加的最后一个数字:\n");
scanf("%d", &number);
printf("累加后的数字为:%d\n", add(number));
}
这个没什么好说的,回想我们高中做过的有关数列的递推关系的题目,比如
核心的递归函数就类似于这个。
运行结果:
2.2 汉诺塔代码
void move(char pos1, char pos2)
{
printf(" %c->%c ", pos1, pos2);
}
void Hanoi(int n, char pos1, char pos2, char pos3)
{
if (n == 1)
move(pos1, pos3);
else
{
Hanoi(n - 1, pos1, pos3, pos2);
move(pos1, pos3);
Hanoi(n - 1, pos2, pos1, pos3);
}
}
int main()
{
Hanoi(1, 'A', 'B','C');
printf("\n");
Hanoi(2, 'A', 'B', 'C');
printf("\n");
Hanoi(3, 'A', 'B', 'C');
printf("\n");
return 0;
}
这里只给到了截至到3的测试样例。
其实这里分两种情况讨论皆可
一种是等于1 直接把A移到C
一种是大于等于2
需要将 n– 1 个盘子从 A 移动到B
将编号为 n 的盘子从 A 移动到C
将 n– 1 个盘子从 B 移动到C
很明显这几步是可以用递归去做的,也就是我们上面展现的核心递归代码
运行结果:(去年期末的痛)
三 总结&反思
递归是一种思维,这种思维不太好理解,因为区别于我们平常的线性思考方式,同样也就体现在了其优越的空间复杂度上。
跟踪递归算法的适合,尽量选用n值较少的情况,否则会比较头大。