博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归系列之一_南诺塔问题
阅读量:6716 次
发布时间:2019-06-25

本文共 2386 字,大约阅读时间需要 7 分钟。

一、递归

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

  构成递归需具备的条件:

    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
24 #include
25 using namespace std;26 27 struct Pole{28 vector
plates;//used for storing the plates29 }Pleft,Pmiddle,Pright;30 31 void move(Pole &sou,Pole &des){
//move the top plate from sou to des32 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;59 for(int i=0;i
View Code

 

 

 

 

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

你可能感兴趣的文章
实现大屏幕全国监控各地流量和负载质量
查看>>
高性能HTTP加速器Varnish(安装配置篇)
查看>>
如何取消OneNote的粘贴来源地址
查看>>
编程乐趣:C#实现读取12306余票信息
查看>>
视频编码的常见参数基本概念
查看>>
用python写一个专业的传参脚本
查看>>
Nginx+PHP7 安装及配置
查看>>
OpenIndiana
查看>>
varnish基础概念详解
查看>>
发一个windows8 下QQ应用的测试报告-精彩截图
查看>>
利用Zabbix ODBC monitoring监控MySQL
查看>>
如何设计一款优秀的短视频 SDK
查看>>
实战postfix邮件发送
查看>>
MySQL主从架构由5.5版本升级到5.6方案
查看>>
大数据时代的遨游
查看>>
从Windows 8.1光盘安装.NET Framework 3.5.1
查看>>
Create Oracle VM High Availability (HA)
查看>>
Memcache持久性分布式数据MemcacheDB
查看>>
联想计算机Lenovo ThinkCentre M910t-NO76的重装
查看>>
大话nbu四(nbu备份恢复catalog)
查看>>