繁体   English   中英

需要解释“河内之塔”中的递归调用

[英]Need an explanation of the recursive calls in “Towers of Hanoi”

我了解递归的概念以及它如何与每次调用叠加。 但是我无法解释当有两个函数调用由printf命令分隔时,递归调用是如何工作的以及如何得到打印。 谁能给我解释一下这个递归调用是如何工作的?

我找到了一个有关“河内之塔”游戏的例子。 Ut用作递归示例。 编码:

#include <stdio.h>

void transfer(int n, char from, char to, char temp);

int main()
{
    int n;

    printf("how many disk");
    scanf("%d", &n);
    printf("\n");
    transfer(n, 'L', 'R', 'C');
    return 0;
}

/*
 * n = number of disk,
 * from = origin,
 * to = destination,
 * temp = temporary storage
 */
void transfer(int n, char from, char to, char temp)
{
    if (n > 0) {
        // Move n-1 disks from origin to temporary
        transfer(n - 1, from, temp, to);

        // Move n th disk from origin to destination
        printf("move disk %d from %c to %c\n", n, from, to);

        // Move n-1 disks from temporary to destination
        transfer(n - 1, temp, to, from);
    }
}

对于n=3它给出这样的输出

move disk 1 from L to R //
move disk 2 from L to C // 
move disk 1 from R to C // 
move disk 3 from L to R // 
move disk 1 form C to L // 
move disk 2 from C to R //
move disk 1 from L to R //

我写这篇文章就是为了回答这样一个问题,我相信很多初学者都会面对这个问题。

当您有n磁盘时,会发生什么情况。

任务是将n个磁盘通过TL移到R ,可以分解为:

  1. 将前n-1磁盘从L移到T
  2. 将底部磁盘从L移到R
  3. n-1磁盘从T移到R

现在请注意,步骤1和步骤3本身就是带有n-1磁盘以及不同的源极和目标极的河内塔问题。 步骤1是从移动n-1个磁盘的一个问题LT通过R和步骤2是将一个问题n-1从磁盘TR通过L

这样,该问题就分解为可以在一个步骤中解决的子问题,这是一个2磁盘问题实例。

  1. 将顶部磁盘从L移至T
  2. 将底部磁盘从L移到R
  3. 将顶部磁盘从T移到R

您可能正在考虑使用称为“ end-recursive”的特殊变体进行递归! hanoi算法之塔不是最终递归的。 相反,它甚至使用两次递归:

  1. 将N-1个磁盘上方的N-1个磁盘移至临时堆栈(第一个transfer()函数调用)
  2. 将磁盘N移到目标堆栈(printf)
  3. 将N-1磁盘从临时堆栈移回到目标bove磁盘N(第二次transfer()函数调用)

transfer()函数递归背后的想法是:如果在n> 1个磁盘上进行操作,它将“工作”委托给它自己的递归调用。 如果使用n == 1进行调用,它将仅移动磁盘。

这是一个修改后的版本,应该可以使事情更清楚:

void transfer(int n, char from, char to, char temp)
{
    if (n > 1) {
        // Move n-1 disks from origin to temporary
        transfer(n - 1, from, temp, to);
    }

    // Move n th disk from origin to destination
    printf("move disk %d from %c to %c\n", n, from, to);

    if (n > 1) {
        // Move n-1 disks from temporary to destination
        transfer(n - 1, temp, to, from);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM