[英]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个磁盘通过T
从L
移到R
,可以分解为:
n-1
磁盘从L
移到T
L
移到R
n-1
磁盘从T
移到R
现在请注意,步骤1和步骤3本身就是带有n-1
磁盘以及不同的源极和目标极的河内塔问题。 步骤1是从移动n-1个磁盘的一个问题L
到T
通过R
和步骤2是将一个问题n-1
从磁盘T
到R
通过L
。
这样,该问题就分解为可以在一个步骤中解决的子问题,这是一个2磁盘问题实例。
L
移至T
L
移到R
T
移到R
您可能正在考虑使用称为“ end-recursive”的特殊变体进行递归! hanoi算法之塔不是最终递归的。 相反,它甚至使用两次递归:
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.