一、递归

  程序调用自身的编程技巧称为递归。

  构成递归需具备的条件:

    1. 子问题须与原始问题做相同的事,且更为简单(往往表现成规模更小);

    2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。

二、经典汉诺塔问题(Tower of Hanoi)

  注:汉诺塔问题介绍和以下图片均来自百度

  汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

  例如,初始有3个柱子的汉诺塔问题的移动过程如下:

  递归过程:   

    (1)把最左柱子上的(n-1)个盘子借助中间的柱子移到最右的柱子。

  (2)把最左柱子上第n个盘子移动最右的柱子。

  (3)把中间的柱子上(n-1)个盘子借助最左柱子移动最右的柱子。

  显然,第(3)步就是一个更小规模的汉诺塔问题,递归思维在这里体现的很明显。

  C++代码实现:

 1 /*
 2  Problem;
 3   Tower of Hanoi
 4
 5  Question Description:
 6   there are 3 poles and n plates,all of them on the leftmost pole at first,in this question.
 7   all of the plates have different sizes and a larger one is piled up on a smaller one.
 8   What you are expected to solve is how to move these plates from the leftmost pole to the rightmost
 9   one through a series of steps. In each step you can just move the top plate from one pole to the
10   top of another pole and each smaller plate cann't be pile up on a bigger one.
11
12  Solution:
13   step1: move all of the n-1 plates from the leftmost pole to the middle pole;
14   step2: move the n-th plate from the leftmost pole to the rightmost pole;
15   step3: move the n-1 plates from the middle pole to the rightmost pole;
16
17   obviously, step3 is a recursion of this question with a smaller scale.
18 */
19
20 /*
21 source code
22 */
23 #include<iostream>
24 #include<vector>
25 using namespace std;
26
27 struct Pole{
28     vector<int> plates;//used for storing the plates
29 }Pleft,Pmiddle,Pright;
30
31 void move(Pole &sou,Pole &des){//move the top plate from sou to des
32     if(des.plates.size()==0){
33         des.plates.push_back(sou.plates[0]);
34     }
35     else{
36         des.plates.insert(des.plates.begin(),sou.plates[0]);
37     }
38     sou.plates.erase(sou.plates.begin());
39 }
40 void TOH(int n,Pole &left,Pole &middle,Pole &right){//recursion function
41     if(n==0) return;
42     TOH(n-1,left,right,middle);
43     move(left,right);
44     TOH(n-1,middle,left,right);
45 }
46
47 void print(Pole p){// print the numbers of plates of the Pole p
48     cout<<"numbers of Plates of the Pole:";
49     int i=0,n=p.plates.size();
50     for(;i<n;i++){
51         cout<<p.plates[i]<<" ";
52     }
53     cout<<endl;
54 }
55
56 int main(){
57     int n;// the quantity of the plate
58     cin>>n;
59     for(int i=0;i<n;i++){
60         Pleft.plates.push_back(i+1);// initiation
61     }
62     TOH(n,Pleft,Pmiddle,Pright);
63
64     print(Pleft);
65     print(Pmiddle);
66     print(Pright);
67 }

View Code

转载于:https://www.cnblogs.com/Hazel-97/p/8783417.html

递归系列之一_南诺塔问题相关推荐

  1. python递归面试题_汉诺塔问题其实很简单 Python 递归经典面试题

    话不多说,上代码 1 def hanoi_move(n, source, dest, intermediate): 2 if n >= 1: # 递归出口,只剩一个盘子 3 hanoi_move ...

  2. python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...

    汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...

  3. 通俗易懂_汉诺塔(java递归实现)

    汉诺塔 汉诺塔介绍 汉罗塔游戏简单来说就是,有三根柱子(记作ABC),A柱子上有从小到大的若干个圆盘,我们要怎么把A柱子上的这若干个圆盘全部挪到C,并且保证顺序还是从小到大. 规则是:挪的过程中大圆盘 ...

  4. 递归和迭代_用 递归 与 迭代 实现汉诺塔问题(PHP实现)

    汉诺塔问题 汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置N个金盘(如下图).游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原 ...

  5. python递归详解+汉诺塔小案例_汉诺塔,python递归实现解法步骤

    def hanoi(n,x,y,z):#函数实现n个盘子在x,y,z,移动 if n==1: print(x, ' --> ', z) else: hanoi(n-1,x,z,y)#将n-1层个 ...

  6. python汉诺塔_汉诺塔递归算法/搬金盘的婆罗门 - Python实现

    汉诺塔递归算法/搬金盘的婆罗门 - Python实现 版权声明 本文节选自作者本人的图书<Python编程基础及应用>,高等教育出版社.本文可以在互联网上自由转载,但必须:注明出处(作者: ...

  7. 汉诺塔python实现_汉诺塔问题深度剖析(python实现)

    当我们学习一门编程语言的时候,都会遇到递归函数这个问题.而学习递归的一个经典案例就是汉诺塔问题.通过这篇文章,观察移动三个盘子和四个盘子的详细过程,您不仅可以深刻的了解递归,也更加熟悉了汉诺塔的游戏的 ...

  8. python学习-递归(阶乘、汉诺塔)

    文章目录 求阶乘(循环) 求阶乘(递归) 汉诺塔 求阶乘(循环) 如果需要求一个数的阶乘,可能刚开始脑海里面冒出来的是循环计算,下面看看循环如何实现: def recur1(num):rst1 = 1 ...

  9. 数据结构之栈与递归的应用(汉诺塔递归解法)

    上一节简单的讲述了递归的实现与简单应用,接下来我们说一下另一个经典应用. 汉诺塔递归解法 一.起源: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, ...

最新文章

  1. 用 Python 使用 Google Colab?岂止是炫酷
  2. 英伟达开源行人生成/重识别代码
  3. 简单介绍--TOSCA自动化测试工具
  4. 深入了解Mybatis架构设计
  5. [链接]开方检验原理
  6. 【线上分享】云原生时代,华为云音视频质量监控与优化实践
  7. Python入门--while循环
  8. 【转】ASP.NET Web应用程序写EventLog出错的解决方案
  9. php 实现顺序查找
  10. 网站被黑检测-网页挂马及暗链检测
  11. 简易散列表实现电话号码查询系统
  12. jdk+jmeter下载安装教程
  13. Java技术栈(总图)
  14. c语言常量要const,C语言常量-C语言const-嗨客网
  15. 2022年5月4号SSM框架整合学习一:
  16. virtual box ubuntu20.04 ros安装摄像头驱动
  17. 中国移动、联动、电信
  18. xiuno论坛部署及常见问题处理
  19. c语言控制台数字键打地鼠,C语言编程打地鼠
  20. 【计算机基础】进制转换

热门文章

  1. linux改英语环境,CentOS6.8中/英文环境切换教程图解
  2. python线程卡死问题解决_python while True造成未响应或卡顿的解决方法
  3. 【阿里云课程】1小时快速掌握Tensorflow核心功能,完成完整的项目实践
  4. 【知识星球】为什么图像分类任务要从256*256中裁剪出224*224
  5. “有三AI百人”专栏作者培养计划启动,爱写作的你还等什么呢?
  6. 【学员分享】程序员效率神器,最常用VIM插件安装大全
  7. 全球及中国生物质能发电产业十四五利用现状及建设布局研究报告2021-2027年
  8. 中国燃料电池行业供应规模及需求前景调研报告2021-2027年版
  9. 手机GSM--SIM卡体系结构
  10. COM笔记-CoCreateInstance