函数的递归调用举例之汉诺塔问题模型

简介: 汉诺塔(Tower of Hanoi)问题模型

前言:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

正文

汉诺塔(Tower of Hanoi)问题模型:

假设有n个盘子,大盘在下,小盘在上。要求将所有盘子由A杆移动到C杆,可以借助B杆,但移动时必须满足以下要求:

(1)每次只能移动1个盘子;

(2)移动过程中,每个杆上的盘子必须保证大盘在下,小盘在上

image.gif编辑              image.gif编辑

汉诺塔玩具模型                                                    由4个圆盘构成的汉诺塔移动步骤

由3个盘子移动图解:

image.gif编辑

image.gif编辑

image.gif编辑

image.gif编辑

 综合可得到移动3个盘子的步骤为: ① A→C,A→B,C→B, ② A→C, ③ B→A,B→C,A→C。 共经历7步。

由此可推出: 移动n个盘子要经历(2n-1)步。

先分析A杆上3个盘子移到C杆上的过程:

① 将A杆上2个盘子移到B杆上(借助C杆)。

② 将A杆上1个盘子移到C杆上。

③ 将B杆上2个盘子移到C杆上(借助A杆)。 其中②可直接实现。①可递归分解为: 将A杆上1个盘子从A杆移到C杆; 将A杆上1个盘子从A杆移到B杆; 将C杆上1个盘子从C杆移到B杆。 第③步可以分解为: 将B杆上1个盘子从B杆移到A杆上; 将B杆上1个盘子从B杆移到C杆上; 将A杆上1个盘子从A杆移到C杆上。

分析可得:n个盘子(n>1)时,若将其从A杆上移至C杆上,需要借助B杆,可以分三步:

(1)将A最上面的n-1个盘子借助C移到B上,即Hn-1次;

(2)将A最下面的一个盘子移到C上,一次就好;

(3)将B上面的n-1个盘子借助A移到C上,即Hn-1次。        

很显然,汉诺塔问题是一个递归问题,可以编写递归函数来实现。

当n>1时,移动盘子的递归过程就是上述三个步骤;递归终止条件就是当n=1时,直接将盘子从A杆移至C杆即可。

汉诺塔问题程序如下:
#include <stdio.h>
void  main()
{ int nd;
  void hanoi(int,char,char,char); 
  printf("input the number of disks:");
  scanf("%d",&nd);
  printf("the step to moving %2d disks:\n",nd);
  hanoi(nd,'A','B','C'); 
}
void hanoi(int n,char a,char b,char c)
{ if(n==1)
    printf("%c-->%c\n",a,c); 
  else
  { hanoi(n-1,a,c,b);     
    printf("%c-->%c\n",a,c); 
    hanoi(n-1,b,a,c); 
  }
}

image.gif

运行结果:

image.gif编辑

注:函数的功能是按要求移动盘子,无需返回值,是void类型。函数的参数有4个,一个是盘子数n,另外三个是代表盘杆的字符变量a,b和c。

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

相关文章
|
编译器
【函数和函数递归】
【函数和函数递归】
55 0
|
算法
函数递归(详细解读)(上)
函数递归(详细解读)(上)
|
7月前
|
Python
Python实现递归的方式来生成斐波那契数列
Python实现递归的方式来生成斐波那契数列
|
2月前
函数的递归
函数的递归
16 0
|
6月前
|
机器学习/深度学习 C语言
|
算法 C语言
你会使用函数的递归和迭代吗?----------C语言函数学习(4)详解
你会使用函数的递归和迭代吗?----------C语言函数学习(4)详解
132 1
|
6月前
|
算法 C语言
汉诺塔问题(函数递归)
汉诺塔问题(函数递归)
65 0
|
6月前
|
C语言
C语言函数递归详解:理解递归的原理与应用
C语言函数递归详解:理解递归的原理与应用
120 0
|
7月前
|
机器学习/深度学习 编译器 C语言
关于函数递归的基础
关于函数递归的基础
55 5