7 累加&汉诺塔的递归实现

本文探讨了递归的基本概念,通过累加和汉诺塔问题展示了递归的实现与应用。作者分享了递归的优缺点,并以代码实例呈现,最后对递归思维进行了总结和反思。

目录

一 概述

二 代码

2.1 累加代码

2.2 汉诺塔代码

三 总结&反思


一 概述

递归是一种很适合计算机的实现方式,在计算机内部是使用栈来实现的,递归的优点是空间复杂性比价低,代码短。但是也有一定的缺点,就是并不是那么高效(时间上),以及并不适合并行化,汉诺塔还是很有意思的一个代码(虽然我一直在被他摧残)

二 代码

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));
}

这个没什么好说的,回想我们高中做过的有关数列的递推关系的题目,比如f(i)=f(i-1)+f(i-2)

核心的递归函数就类似于这个。

运行结果:

 

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值较少的情况,否则会比较头大。

汉诺塔问题是一个经典的递归和递推问题。汉诺塔又称河内塔,源于印度古老传说,大梵天创造世界时做了三根金刚石柱子,一根柱子上从下往上按大小顺序摞着若干片黄金圆盘,要求把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,且小圆盘上不能放大圆盘,三根柱子间一次只能移动一个圆盘[^3]。 ### 三塔汉诺塔递推算法 设 \(d[i]\) 表示从A塔移动 \(i\) 个圆盘到C塔的最优步数。考虑先移动 \(i - 1\) 个圆盘到B塔,最优步数为 \(d[i - 1]\),此时A塔还剩1个圆盘,再将这个圆盘移动到C塔,最后把 \(i - 1\) 个圆盘从B塔移动到C塔,方案数累加可得递推公式:\(d[i]=d[i - 1]+1 + d[i - 1]=2d[i - 1]+1\) [^1][^4]。 ### 三塔汉诺塔递推算法代码示例(C++) ```cpp #include &lt;iostream&gt; using namespace std; const int MAXN = 100; int d[MAXN]; int main() { int n; cout &lt;&lt; &quot;请输入汉诺塔的圆盘数量:&quot;; cin &gt;&gt; n; d[1] = 1; // 初始化,一个圆盘只需要移动1次 for(int i = 2; i &lt;= n; i++) { d[i] = 2 * d[i - 1] + 1; } cout &lt;&lt; &quot;移动 &quot; &lt;&lt; n &lt;&lt; &quot; 个圆盘的最少步数是:&quot; &lt;&lt; d[n] &lt;&lt; endl; return 0; } ``` ### 四塔汉诺塔递推算法 对于四塔汉诺塔问题,需要先了解三塔汉诺塔的递推。 ### 四塔汉诺塔递推算法代码示例(思路) ```python # 假设已经有三塔汉诺塔的函数 d(i) def d(i): if i == 1: return 1 return 2 * d(i - 1) + 1 # 四塔汉诺塔递推 MAXN = 100 f = [float(&#39;inf&#39;)] * MAXN f[1] = 1 for i in range(2, MAXN): for j in range(1, i): f[i] = min(f[i], 2 * f[j] + d(i - j)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值