河内的线性塔

Posted

技术标签:

【中文标题】河内的线性塔【英文标题】:linear towers of hanoi 【发布时间】:2009-10-20 17:47:05 【问题描述】:

我有一个关于河内线性塔的问题。

我在 C++ 中实现了它,但我尝试使用尾递归或迭代方法来做同样的事情。我的算法有问题。

这段代码 sn-p 显示了将块从中间塔转移到末端塔。

#include <stdlib.h>
#include <stdio.h>
using namespace std;

//int a[5]=2,3,1,2,1;
int from,spare,to;

int main()

//int n;

//void hanoi(int,int,int,int);
void linear_hanoi(int,int,int,int);
void mid_to_end(int,int,int,int);
void end_to_mid(int,int,int,int);
//mid_to_end(3,2,3,1);
end_to_mid(4,3,2,1);
getchar();
return 0;


void linear_hanoi(int n, int from, int to, int spare)

     if(n>0)
      
            linear_hanoi(n-1,from,to,spare);
            cout<<"move ring "<<n<<" from tower "<<from<<" to tower "<<spare<<endl;
            linear_hanoi(n-1,to,from,spare);
            cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<to<<endl;
            linear_hanoi(n-1,from,to,spare);
      

void mid_to_end(int n, int from, int to, int spare)

  if(n>0)
  
     mid_to_end(n-1,from,spare,to);
     cout<<"move ring "<<n<<" from tower "<<from<<" to tower "<<to<<endl;
    // mid_to_end(n-1,spare,from,to);
   //  mid_to_end(n-1,from,to,spare);
   //cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<from<<endl;
  // mid_to_end(n-1,from,to,spare);
    //cout<<"move ring "<<n<<" from tower "<<spare<<" to tower "<<from<<endl;
 

我做错了什么?

【问题讨论】:

就算不是,也是别人的功课;将其标记为这样。 不,我应该写一篇研究论文..比较递归和尾递归 这听起来像是我的功课。 这不是功课老兄..我只是想要一个逻辑来迭代或尾递归 谁在乎这是否是家庭作业?这不是一个“向我发送 codez”的问题,何必呢? 【参考方案1】:

来自***:

简单的解决方案: 以下解决方案是玩具拼图的简单解决方案。

在最小块和非最小块之间交替移动。移动最小的棋子时,始终沿相同的方向移动(如果开始的棋子数为偶数则向右移动,如果开始的棋子数为奇数则向左移动)。如果所选方向没有塔,则将棋子移到另一端,然后继续朝正确的方向移动。例如,如果您从三块开始,则将最小的一块移动到另一端,然后继续向左移动。当转牌是移动非最小的棋子时,只有一个合法的移动。这样做应该用最少的动作完成谜题。

【讨论】:

【参考方案2】:

您可以将代码转换为连续传递样式。那么一切都是尾递归的......

【讨论】:

以上是关于河内的线性塔的主要内容,如果未能解决你的问题,请参考以下文章

河内塔游戏

河内塔

汉诺塔(河内塔)问题:

河内塔 C++(使用递归)

关于河内塔递归算法时间复杂度的问题

河内塔 - 如何不跳过每次递归的挂钩