【问题标题】:How to index each steps of moving disk in Tower of Hanoi (recursive approach)如何索引河内塔中移动磁盘的每个步骤(递归方法)
【发布时间】:2022-01-04 15:26:32
【问题描述】:

在TOH(河内塔)中打印从源到目的地的移动磁盘可以很容易地用C/C++编写。(具有递归功能) 但是我们如何打印每一步的索引呢? C代码-

#include<stdio.h>
void tower( int disk, int peg1, int peg2, int peg3);// function declaration
int main()
{
    int disk;
    int peg1= 1, peg2= 2, peg3= 3;//numbering 
    puts("enter disk");
    scanf("%d", &disk);//read disks
    tower(disk, peg1, peg2, peg3);//function using
    return 0;
}
void tower( int disk, int peg1, int peg2, int peg3)//function definition
{
    
    if(disk ==1)//if only 1 disk is avialable
    {
    printf("move disk from peg%d to peg%d\n",peg1,peg3);//moving disk from source to destination
    }
    else
    {
      tower(disk-1, peg1,peg3,peg2);//moving n-1 disk from peg 1 to peg2 using peg3
      printf("move disk from peg%d to peg%d\n", peg1,peg3);//move last biggest disk
      tower(disk-1,peg2,peg1,peg3);//moving n-1 disk from peg2 to peg3 using peg1
    }

它可以工作并打印输出。

但是有没有办法索引(1,2,...)每个步骤,比如-

  1. 将磁盘从 peg1 移动到 peg3
  2. 将磁盘从 peg1 移到 peg2

【问题讨论】:

  • Edit 并向我们展示您迄今为止编写的代码。然后明确每一步打印索引是什么意思。另请阅读:How to Ask.
  • 上面的递归函数打印输出,但是如何编号(1,2,3,4....)每个打印行(步骤)?
  • 为什么我会收到 -ve 票??????
  • 因为您的问题的第一个版本非常糟糕。现在好多了,我收回了我的反对票。但这仍然有些不清楚。您应该添加一个输入和期望与实际输出的示例

标签: c function recursion towers-of-hanoi


【解决方案1】:

首先请注意,您不需要在 else 中 printf 某些东西 分支,因为这是由您的递归函数库管理的 案例。

要打印索引,最简单的解决方案(如果我们排除全局 变量)会给你的递归函数一个额外的 指针参数引用一个整数,该整数是打印的行数。每次你 打印一行,此指针引用的整数加 1。这给出了下面的函数 tower_ptr

#include <stdio.h>

void tower_ptr(int * index, int disk, int src, int tmp, int dst) {    
  if(disk == 1) {
    (*index) ++;
    printf("%d. move %d -> %d\n", *index, src, dst);
  } else {
    tower_ptr(index, disk - 1, src, dst, tmp);
    tower_ptr(index, 1, src, - 1, dst);
    tower_ptr(index, disk - 1, tmp, src, dst);
  }
}

int main() {
  int index = 0;
  int disk;
  puts("enter disk");
  scanf("%d", &disk);
  tower_ptr(&index, disk, 1, 2, 3);
  return 0;
}

另一个解决方案是给你的函数一个额外的参数 这是下一个要打印的索引。函数返回数量 打印的索引。这给出了下面的函数tower_int

#include <stdio.h>

int tower_int(int index, int disk, int src, int tmp, int dst) {    
  if(disk == 1) {
    printf("%d. move %d -> %d\n", index + 1, src, dst);
    return index + 1;
  } else {
    index = tower_int(index, disk - 1, src, dst, tmp);
    index = tower_int(index, 1, src, - 1, dst);
    index = tower_int(index, disk - 1, tmp, src, dst);
    return index;
  }
}

int main() {
  int index = 0;
  int disk;
  puts("enter disk");
  scanf("%d", &disk);
  tower_int(0, disk, 1, 2, 3);
  return 0;
}

【讨论】:

  • 感谢您的代码...
  • @HIMANSHUNARAYAN 如果它解决了您的问题,请考虑投票并接受答案...
  • 您的回答很有帮助。再次感谢@qouify
  • @HIMANSHUNARAYAN 不客气。很高兴我能帮上忙。
  • 您好@qouify,请清除一些疑问-----'-1' 用于第二个递归函数中的临时,是否有必要(对于 1 个磁盘,此步骤与基本情况相同)? ????。任何数值(+ve/-ve 而不是 -1)都会打印相同的结果。如果 '-1' 替换为 'tmp' 也是如此(对于 1 个磁盘,不需要 temp)。
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2013-11-11
  • 2016-05-25
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
相关资源
最近更新 更多