数据结构 线性表 递归实现汉诺塔

        关于汉诺塔的问题,谷歌如下:

最早发明这个问题的人是法国数学家爱德华·卢卡斯

传说越南河内某间寺院有三根银棒,上串64个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。但不知道是卢卡斯自创的这个传说,还是他受他人启发。

若传说属实,僧侣们需要264 − 1步才能完成这个任务;若他们每秒可完成一个盘子的移动,就需要5845亿年才能完成。整个宇宙现在也不过137亿年。

这个传说有若干变体:寺院换成修道院、僧侣换成修士等等。寺院的地点众说纷纭,其中一说是位于越南河内,所以被命名为“河内塔”。另外亦有“金盘是创世时所造”、“僧侣们每天移动一盘”之类的背景设定。

佛教中确实有“浮屠”()这种建筑;有些浮屠亦遵守上述规则而建。“汉诺塔”一名可能是由中南半岛在殖民时期传入欧洲的。


C语言实现:

#include<stdio.h>

void function(int n,char x,char y,char z)//将n个,从x轴借助y轴移到z轴
{
	if(n==1)
	{
		printf("%c ----> %c\n",x,z);
	}
	else
	{
		function(n-1, x,z,y);
		printf("%c ----> %c\n",x,z);
		function(n-1,y,x,z);
	}
}

int main()
{
	int n=3;
	printf("排列顺序如下:\n");
	function(n,'x','y','z');
	return 0;
}


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汉诺塔问题是经典的递归问题,可以用栈和线性表实现。 我们可以用一个栈来表示三个塔,另外一个栈用于存储要移动的盘子,用一个变量记录当前要移动的盘子编号和目标塔的编号。 具体实现步骤如下: 1. 初始化三个塔,将所有盘子都放在第一座塔上 2. 如果还有盘子需要移动,则执行以下步骤: 1)将当前要移动的盘子从原塔上取下来,放入待移动栈中 2)查看目标塔顶部的盘子编号,如果目标塔为空,或者当前盘子编号小于目标塔顶部盘子编号,则将盘子从待移动栈中取出来,放到目标塔上,并更新当前位置和目标位置 3)否则,将目标塔顶部的盘子取下来,放入待移动栈中,并更新当前位置和目标位置 4)重复执行以上步骤,直到所有盘子都移动到目标塔上 具体的代码实现可以参考如下: ``` #include <iostream> #include <stack> using namespace std; void move(int& from, int& to, stack<int>& fromStack, stack<int>& toStack) { int num = fromStack.top(); fromStack.pop(); toStack.push(num); from = num; to = !from && !to ? 2 : from ^ to ^ 1; } void hanoi(int n) { stack<int> s[3]; int from = 0, to = 0; for (int i = n; i > 0; --i) s.push(i); while (s.size() != n) { if (s[from].empty() || (!s[to].empty() && s[from].top() > s[to].top())) { move(to, from, s[to], s[from]); } else { move(from, to, s[from], s[to]); } } } int main() { hanoi(3); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值