递归3: 汉诺塔的递归与迭代实现

本文探讨了汉诺塔问题的递归和迭代两种实现方式。在将N值设为15的情况下,递归版本的move()函数运行时间为44秒,而迭代版本的movecopy()函数用时80秒,显示出递归方法在该问题上的效率优势。
摘要由CSDN通过智能技术生成
递归实现与main():
/*------------------------------------------------------
汉诺塔主要是有三个塔座X,Y,Z,要求将从小到大编号为 1,2.....n 的
圆盘从X移动到塔座Z上,要求
 (1):每次只能移动一个圆盘
 (2):圆盘可以插到X,Y,Z中任一塔座上
 (3):任何时候不能将一个较大的圆盘压在较小的圆盘之上
 初始:所有圆盘都在 X 塔座,并且最大的圆盘在最底部,然后是次大的;
 结束:所有圆盘都在 Z 塔座,并且最大的圆盘在最底部,然后是次大的;
------------------------------------------------------*/
#include <iostream>
#include <ctime>	// time()
using namespace std;
/*-----------------------------------------------------------
前置条件: n > 0
后置条件: 输出将n个圆盘从源塔座(orig)移动到目的塔座(dest)的步骤,
		 临时塔座(temp)用于临时存放。
算法(递归):
		n == 1时,把盘1从源移动到目的地
		n > 1时,
			1)将n-1个圆盘(每次移动一个)从源移动到临时塔座
			2)将盘n从源移动到目的地
			3)将n-1个圆盘(每次移动一个)从临时塔座移动到目的塔座
时间复杂度: wotstTime(n) 是 O(2^n).
空间复杂度: worstSpace(n) 是 O(n).
-----------------------------------------------------------*/
void move(int n, char orig[], char dest[], char temp[])
{
	static char ori = 'X', tem = 'Y', des = 'Z', ch;	// 三个塔座
	static int num = 0, length = n;		// num记录移动步数, length保存圆盘数目
	if (n <= 0){	// 处理参数传递错误
		cout << "The value is error!\n";
		return;
	}
	if (n == 1){	// 通用策略: n == 1时情况
		dest[n-1] = orig[n-1];
		num++;
		cout << num << ") Disc " << orig[n-1] << ": "
			 << ori << "-->" << des << endl;
	}
	else{			// 通用策略: n > 1时情况
		ch = des; des = tem; tem = ch;
		move(n-1, orig, temp, de
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值