关于递归和汉诺塔

  汉诺塔这个问题很经典,不清楚题目的同学可以去百度一下,在这小子就不多说了,进入正题;

  让我们打开表格,看看这座塔:

  

  这塔看起来不咋地对不对?不过,我们的目标是把它原封不动的搬到c列上,可以借助b列。让我们从最简单的做起:假设只有两层,从下往上分别是1,2,这时候你会说这题目简直就是在侮辱你的智商!只需要三步:

    First.将2从a列移到b列;

    Second.将1从a列移到c列;

    Finally.将2从b列移到c列;

  很简单对不对?那现在,让我们做做完整版:64层!不要紧张,先试试将1之上的所有积木只当做一层,那么我们又回到了刚才那简单的两层问题。所以,我们有f(n)来表示n层问题的答案,把1之上的积木移到b列需要f(n-1)步,将1移到c列(需要1步),再将b列上的积木移到c列又需要f(n-1)步。所以,可以得到等式:

    f(n)=2*f(n-1)+1

  这就是我们的递归公式了。

  再看看步骤是如何输出的:

    先定义一个子函数,函数名怎样都可以,只要不与保留字重复,如:

      

void f(int n,char a,char c,char b);
//这里的参数所代表的意义是一个n层的汉诺塔,从a柱移到c柱上,其中可以借助b柱;

    1.然后,把1之上的积木从a列移到b列,期间是可以借助c列的:

      f(n-1,a,b,c);

    2.将1移到c列(这只有一步,不需借助其他列):

      printf("%d from %c to %c\n",n,a,c);

    3.再将b列上的积木移到c列,借助a列(因为现在的a列是空闲的):

      f(n-1,b,c,a);

  说了那么多,让我们看看代码长什么样吧:

#include<stdio.h>
int t=0;//需要操作的总步数为t步
void f(int n,char a,char c,char b);//把n盘从a柱移到c柱,借助b柱
int main()
{
    int n;
    scanf("%d",&n);
    f(n,‘A‘,‘C‘,‘B‘);
    return 0;
}
void f(int n,char a,char c,char b)
{
    if(n==0)    return;
    f(n-1,a,b,c);
    t++;//统计操作步数
    printf("%d:%d from %c to %c\n",t,n,a,c);
    f(n-1,b,c,a);
}

  代码有不足的还请包涵,有兴趣的同学可以跟踪一下它的执行过程,可以帮助你更好的了解递归算法的实现方式。

  

    

时间: 2024-10-11 17:23:39

关于递归和汉诺塔的相关文章

20150410 递归实现汉诺塔算法

20150410 递归实现汉诺塔算法 2015-04-10 Lover雪儿 1 //汉诺塔 2 #include <stdio.h> 3 4 static int i = 0; 5 6 //将n个盘子从x借助y移动z 7 //n:移动的个数 x:源地址 y:中间柱子 z:目的柱子 8 void move(int n, char x, char y, char z) 9 { 10 if(1 == n){ 11 printf("第%d次移动 %c--->%c\n", ++

递归__汉诺塔

要将n个盘子从a 通过b 移动到c那么 就要先将 n-1个盘子从a通过c 移动到b再将a最底下的盘子移动到 c之后再将 n-1个盘子从b通过a移动到c由此可得到 递归公式hanoi(int n,char from,char denpend_on,char to):{ //n:盘子数from:a,denpend_on:b,to:c //此语句意义为 将n个盘子从from 通过 denpend_on移动到tohanoi(n-1,from,to,denpend_on);move(n,from,to);

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一

Python递归实现汉诺塔

Python递归实现汉诺塔: def f3(n,x,y,z): if(n==1): print(x,'--->',z) else: f3(n-1,x,z,y) print(x,'--->',z) f3(n-1,y,x,z) n=int(input('请输入汉罗塔层数:')) f3(n,'X','Y','Z') 运行结果如下:

递归求汉诺塔的解

递归求汉诺塔的解 // 递归求汉诺塔的解.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> #include<conio.h> #include<windows.h> void HanoiTower(int,char,char,char); void main() { int n; char A='A',B='B',C='C'; printf("---Hanoi To

Go基础之函数递归实现汉诺塔

Go递归实现汉诺塔 package main import "fmt" // a 是源,b 借助, c 目的长度 func tower(a, b, c string, layer int) { if layer == 1 { fmt.Println(a, "111->", c) return } // n-1 个 a 借助 c 到 b tower(a, c, b, layer-1) fmt.Println(a, "11->", c)

递归之汉诺塔问题

有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 问:如何移?最少要移动多少次? 这个问题也就是著名的汉诺塔问题,以上对问题的描述摘于维基百科(因为懒,所以不手打了),对于这个问题的详细描述请点击一下维基百科的页面. 对于这个问题,刚开始确实不太好理解,不过我们可以从三个圆盘开始,最简单的方法

数据结构(java语言描述)递归实现——汉诺塔问题

1.汉诺塔问题描述 N阶汉诺塔:假设有3个分别命名为x,y,z的三个塔座,在x上有n个盘子,直径大小不同,有小到大按标号1,2,3...n排列,要借助y将n个盘子转移到z上,期间不能让小盘子压在大盘子上.规则: 每次至移动一个盘子: 盘子可以插在x,y,z任意一个塔座上: 任何时候都不能将大盘压在小盘上. 2.解题思路 当n=1时,直接把盘子由x——>z; 当n>1时,需利用y,首先将(n-1)个盘子由x——>y,把第n个实现x——>z,然后把问题转换为实现(n-1)个盘子由y——

C#递归解决汉诺塔问题(Hanoi)

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExample_Hanoi_{    class Program    {        static void Main(string[] args)        {            HanoiCalculator c = new HanoiCalculator();            Cons