Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 河内塔内圆盘的移动_C_Recursion - Fatal编程技术网

C 河内塔内圆盘的移动

C 河内塔内圆盘的移动,c,recursion,C,Recursion,请使用F7逐步向我解释递归过程 我只是无法将回报与控制流联系起来 #include<stdio.h> #include<conio.h> void t_of_h(char, char, char, int); void main() { int n; clrscr(); printf("Enter no of DISC in Tower of Hanoi : "); scanf("%d",&n); printf("\

请使用F7逐步向我解释递归过程

我只是无法将回报与控制流联系起来

#include<stdio.h>
#include<conio.h>

void t_of_h(char, char, char, int);

void main()
{
    int n;
    clrscr();

    printf("Enter no of DISC in Tower of Hanoi : ");
    scanf("%d",&n);

    printf("\nTower of Hanoi using %d DISCS\n",n);

    t_of_h('X', 'Y', 'Z', n);
    getch();
}

void t_of_h(char p1, char p2, char p3, int n)
{
   if(n==0)
     printf("Unsuccessful move\n");
   if(n==1)
     printf("Move DISC from %c to %c\n",p1,p3);
   else
   {
      t_of_h(p1,p3,p2,n-1);
      t_of_h(p1,p2,p3,1);
      t_of_h(p2,p1,p3,n-1);
   }
}
#包括
#包括
void t_of_h(char,char,char,int);
void main()
{
int n;
clrsc();
printf(“在河内塔中输入光盘编号:”);
scanf(“%d”和“&n”);
printf(“\n使用%d张光盘的河内电源,\n”,n);
t_of_h('X','Y','Z',n);
getch();
}
无效t_of_h(字符p1、字符p2、字符p3、整数n)
{
如果(n==0)
printf(“不成功的移动\n”);
如果(n==1)
printf(“将光盘从%c移动到%c\n”,p1,p3);
其他的
{
t_of_h(p1,p3,p2,n-1);
t_of_h(p1,p2,p3,1);
t_of_h(p2,p1,p3,n-1);
}
}

如何将N个磁盘从A塔移动到B塔

  • 将N-1个磁盘从A塔移动到C塔
  • 将底部圆盘从A塔移至B塔
  • 将N-1个磁盘从塔C移动到塔B
  • 代码是这一点的一个相当直接的实现。如果您假设可以将任意数量的磁盘从一个塔移动到另一个塔,那么这显然是可行的。如何将N-1个磁盘从A塔移动到C塔?那么,你把N-2个磁盘从A塔移到B塔,然后把N-1个磁盘从A塔移到C塔,然后把N-2个磁盘从B塔移到C塔。然后重复

    最终,递归停止,因为只有一个磁盘需要移动

    一个有趣的练习是“编写一个测试工具,确保没有无效的移动”


    好的-我已经运行了代码。它对这一过程的形象化令人毛骨悚然。很难看出发生了什么事。但它直接反映了算法的功能。现在怎么办

    1个磁盘 2个磁盘 请注意,它正在将磁盘从X移动到Z。如何将两个磁盘从X移动到Z?将顶部磁盘从X移动到Y。将底部磁盘从X移动到Z。将原始顶部磁盘从Y移动到Z

    3个磁盘
    如何将N个磁盘从A塔移动到B塔

  • 将N-1个磁盘从A塔移动到C塔
  • 将底部圆盘从A塔移至B塔
  • 将N-1个磁盘从塔C移动到塔B
  • 代码是这一点的一个相当直接的实现。如果您假设可以将任意数量的磁盘从一个塔移动到另一个塔,那么这显然是可行的。如何将N-1个磁盘从A塔移动到C塔?那么,你把N-2个磁盘从A塔移到B塔,然后把N-1个磁盘从A塔移到C塔,然后把N-2个磁盘从B塔移到C塔。然后重复

    最终,递归停止,因为只有一个磁盘需要移动

    一个有趣的练习是“编写一个测试工具,确保没有无效的移动”


    好的-我已经运行了代码。它对这一过程的形象化令人毛骨悚然。很难看出发生了什么事。但它直接反映了算法的功能。现在怎么办

    1个磁盘 2个磁盘 请注意,它正在将磁盘从X移动到Z。如何将两个磁盘从X移动到Z?将顶部磁盘从X移动到Y。将底部磁盘从X移动到Z。将原始顶部磁盘从Y移动到Z

    3个磁盘 使用F7

    如果你在理解递归时遇到困难,拿出一支笔和一张纸,一步一步地完成这个程序。用正确的参数堆叠每个调用

    当您可以可视化它时,它应该更简单。

    使用F7

    如果你在理解递归时遇到困难,拿出一支笔和一张纸,一步一步地完成这个程序。用正确的参数堆叠每个调用


    当您可以可视化它时,它应该更简单。

    请注意“void main()”是错误的-
    int main()
    是可以的,尽管
    int main(void)
    可以说更好,并且成功后应返回0。另外,
    头是非常特定于Windows的,使用
    clrsc()
    getch()
    也是如此-它们不是ISO标准的C函数和头。如果我使用int main(),我将面临使用getch()和return语句的冲突。一条警告消息即将出现:无法访问code@alfesani:那么,getch()应该在
    中声明;您需要添加“return 0;”在声明返回
    int
    时的
    main()
    末尾。无法访问的代码?这很奇怪。。。当我在MacOS X上测试编译时,我省略了“clrsc()”、“getch()”和标题。在GCC 4.5.1下,代码是干净的,带有选项
    GCC-O-std=c99-Wall-Wextra-Wmissing prototype-Wstrict prototype-Wold样式定义hanoi.c-O hanoi
    。对不起,先生,我不是说你错了。我使用windows xp和turbo c编译器。我是bca二年级的学生。我对工业上使用的编译器一无所知。我的编译器给出了输出,我刚刚发布了它。如果你介意的话,我真的sorry@alfesani当前位置我没有大惊小怪-我手头没有Windows机器,所以我无法重现您的问题。我不确定这是否不应该被视为一种“残酷和不寻常的惩罚”,让人们在Windows上学习计算——特别是C编程。这也意味着我无法告诉您为什么会看到所看到的错误。请注意,“void main()”是错误的-
    int main()
    是可以的,尽管
    int main(void)
    可以说更好,成功后您应该返回0。另外,
    头是非常特定于Windows的,使用
    clrsc()
    getch()
    也是如此-它们不是ISO标准的C函数和头。如果我使用int main(),我将面临使用getch()和return语句的冲突。一条警告消息即将出现:无法访问code@alfesani:那么,getch()应该在
    中声明;您需要添加“return 0;”在声明返回
    int
    时的
    main()
    末尾。无法访问的代码?这很奇怪。。。在MacOS X上进行编译测试时,我省略了“clrsc()”、“getch()”和头文件。在GCC 4.5.1下,使用选项
    GCC-O-std=c99-Wall-Wextra-Wmissing-prototype-Wstrict-prototype,代码很干净,有明显的修复
    
    Enter no of DISC in Tower of Hanoi : 1
    
    Tower of Hanoi using 1 DISCS
    Move DISC from X to Z
    
    Enter no of DISC in Tower of Hanoi : 2
    
    Tower of Hanoi using 2 DISCS
    Move DISC from X to Y
    Move DISC from X to Z
    Move DISC from Y to Z
    
    Enter no of DISC in Tower of Hanoi : 3
    
    Tower of Hanoi using 3 DISCS
    Move DISC from X to Z
    Move DISC from X to Y
    Move DISC from Z to Y
    Move DISC from X to Z
    Move DISC from Y to X
    Move DISC from Y to Z
    Move DISC from X to Z