首页 > 用户投稿

汉诺塔递归算法c语言 汉诺塔递归算法?

汉诺塔递归算法?

1//河内塔

2#包括和酒店。h>

3voidhanoi(intn,chara,charb,charc)//这里表示在b列的帮助下将a列上的图版移到c列

4{if(1==n)//如果是图版,将a列上的图版移到c列

汉诺塔递归算法c语言 汉诺塔递归算法?

5{

6printf(%c-->%cn,a,c)

7}

8else

9{

10hanoin-1,a,c,b)//moven-1platesoncolumnatocolumnbwiththecolumnc

11printf(%c-->%cn“,a,c)//将a列的最后一块板移到c列

12hanoi(n-1,b,a,c)//然后将b列的n-1板移到c

13}

14}

15intmain()

16{intn

17printf输入磁盘数:”)

18scanf(%d“,&n)

19hanoi(n,%a”,%b“,%c”)

20return0

21}

复制代码

让hanoi塔板为d1,d2,d3,。。。dn自上而下,n>0。注意,前k个板是s(k)(k>1)递归。假设前n-1块板是s(n-1)块。要将板从a移到c,只需要使用桥b。具体的移动方法是:(1)s(n-1):a=>b(2)dn:a=>c(3)s(n-1):b=>c实际上是一个具有四个参数f(n,a,b,c)的函数。第一步和第三步实际上又回到了n-1层河内塔的问题。以第一步为例,将前n-2个板看作一个整体s(n-2),问题变成将板从a移到b,此时需要以c为桥。移动方法如下:(4)s(n-2):a=>c(5)d(n-1):a=>b(6)s(n-2):a=>c(5)d(n-1):a=>b(6)s(n-2):s(n-1):a=>c实际上,c=>b和(1)、(2)、(3)的步骤没有区别,只是[bridge]b和c被交换:通过(1)、(2)、(3)总结函数:(1)f(n-1,a,c,b)//参数a是原始位置,c是桥,b是目的地(2)n:a=>c//从原始位置取底板=>目的地(3)f(n-1,b,a,c)//参数b是原始位置,a是桥,c是目的地。递归解很容易理解。更困难的是使用非递归方法。实际上,所有的递归算法都可以转化为非递归算法。一些低级语言(如汇编)没有递归算法。

汉诺塔的递归算法不理解?

为什么不直接用三层呢?#include<iostream>usingnamespacestdconstintn=4voidmove(charfrom,charto){ 输出<<“from”<<from<<“to”<<to<<endl}voidhanoi(intn,charp1,charp2,charp3){ 移动(n==1) 移动(p1,p3) 移动(n-1,p1,p3,p2) 移动(p1,p3) 移动(n-1,p2,p1,p3) } main() { hanoi(n,“a”,“b”,“c”) 返回0 }

汉诺塔递归算法c语言汉诺塔递归算法图解汉诺塔c语言程序详解

原文标题:汉诺塔递归算法c语言 汉诺塔递归算法?,如若转载,请注明出处:https://www.saibowen.com/tougao/19183.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「赛伯温」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。