汉诺塔的非递归问题C语言

bayhax 2016-10-31 08:31:39
如题,汉诺塔接触过递归问题,但是非递归程序用C语言实现的话,有点难理解,在网上找了找没有找到太实在想要的,大神可以把代码贴出来给我参考一下吗?还有就是为什么汉诺塔讨论非递归呢?用堆栈?
...全文
307 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ck2333 2016-10-31
  • 打赏
  • 举报
回复
个人觉得楼主没必要研究这种问题,很明显非递归会很麻烦,咋们写程序讲的是更优化,所以只需要弄懂它的递归实现就可以了。
mLee79 2016-10-31
  • 打赏
  • 举报
回复
无聊的时候好像我还写过一个 汇编版本的, 不过仍然是递归的, 应该速度还好, 不过好像只有32位版本... http://bbs.csdn.net/topics/110155915
mLee79 2016-10-31
  • 打赏
  • 举报
回复
汉诺塔 没非递归的, 那种用栈模拟递归的只是更难看的递归 , 比如这样...

#include <stdio.h>
#include <assert.h>

#define MAXN	256
#define move( from , to )  	printf("%c-->%c\n" , from , to)
#define SWAP( a , b )		do { a^=b; b^=a; a^=b; } while(0)

void hanio( int n , int from , int temp , int to )
{
	int skp = 0;
	int sk_n[ MAXN ] , sk_from [ MAXN ] , sk_temp [ MAXN ] , sk_to [ MAXN ];

	assert(n < MAXN);	
	while( 1 )
	{
		if( n == 1 )
		{
			move( from , to ); 
		}	
		else
		{
			sk_n   [ skp ] = -- n ;
			sk_from[ skp ] = temp ;
			sk_temp[ skp ] = from ;
			sk_to  [ skp ] = to   ;
			++ skp                ;
			SWAP( to , temp );
			continue;
		}
		
		if( skp-- )
		{	
			n    = sk_n	   [ skp ] ;
			temp = sk_temp [ skp ] ; 
			from = sk_from [ skp ] ;
			to   = sk_to   [ skp ] ;
			
			move( temp , to );
			continue;
		}
		else 
			break;
	}	
}

int main()
{
	hanio(5, 'A', 'B', 'C');

	return 0;
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧