递归之汉诺塔

递归的定义:

一个函数自己直接或间接调用自己(一个函数调用另外

一个函数和他调用自己是一模一样的,都是那三步,

只不过在人看来有点诡异。)

递归满足的三个条件:

1、递归必须得有一个明确的终止条件

2、该函数处理的数据规模必须在递减

3、这个转化必须是可解的。

循环和递归:

理论上循环能解决的,肯定可以转化为递归,但是这个

过程是复杂的数学转化过程,递归能解决不一定能转化

为循环,我们初学者只要把经典的递归算法看懂就行,

至于有没有能力运用看个人。

递归:

易于理解

速度慢

存储空间大

循环

不易于理解

速度快

存储空间小

汉诺塔代码:

/*汉诺塔
如果n为1
    把A上面的直接移动到C
否则
    把A上面(n-1)通过C移动到B;
    把A第n个移动到C上;
    再把B上面(n-1)的通过A移动到C上;
*/
#include<stdio.h>

int i = 0;
void hannuota(int n,char A,char B,char C)
{
    if(1 == n)
        printf("%d...把%c最上面的移动到%c\n\n",++i,A,C);
    else
    {
        hannuota(n-1,A,C,B);
        printf("%d...把%c最上面的移动到%c\n\n",++i,A,C);
        hannuota(n-1,B,A,C);
    }
}
int main()
{
    int n;
    printf("请输入盘子的数量:");
    scanf("%d",&n);
    char ch1 = ‘A‘,ch2 = ‘B‘,ch3 = ‘C‘;
    hannuota(n,ch1,ch2,ch3);
    printf("OVER............................\n");
}

把大的数据规模一层一层化小.重要的是思想,代码很简单.

原文地址:https://www.cnblogs.com/Aidongshu/p/8423210.html

时间: 2024-10-11 03:34:54

递归之汉诺塔的相关文章

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列上,可以借助b列.让我们从最简单的做起:假设只有两层,从下往上分别是1,2,这时候你会说这题目简直就是在侮辱你的智商!只需要三步: First.将2从a列移到b列: Second.将1从a列移到c列: Finally.将2从b列移到c列: 很简单对不对?那现在,让我们做做完整版:64层!不要紧张,先试试将1之上的所有积

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