再论递归

再论递归

大概是从汉诺塔hanoi了解递归算法的:

function hanoi(n, a, b, c) {if(n===1) {console.log(`${a} ---> ${c}`)return}hanoi(n-1, a, c, b);hanoi(1, a, b, c);hanoi(n-1, b, a, c);
}hanoi(10, 'A', 'B', 'C');

我自诩脑回路清奇,然而面对这层层递归,大脑CPU却显得不堪重负,甚至一度崩盘!并且作为一个~伪~编程人员,如果让别人知道我对递归这样的基本算法都搞不定,颜面何存呐?!!所以,对此我一直耿耿于怀。

直到昨天晚上(2017/12/21真是个伟大的日子),我在知乎看到一个回答,简单粗暴。原答案见python中的汉诺塔递归算法的具体运算过程是怎样的?

@半岛 的回答:

重点其实是:不要一开始就关心每一步怎么解决的,你只需要把函数当成一个实现你目的的神器,随时调用。也就是递归。

01

比如说我们有一个万能神器move,只需要给它几个参数,即可自动完成一个功能:把n个盘子利用缓冲区,从起点运送到终点,期间严格遵守汉诺塔规则。
这里你暂时不需要去了解每一个步是如何实现的。

move(N,起点,缓冲区,终点)
N: 盘子的个数。

02

现在有个n个盘子,a,b,c三个塔。
把n个盘子抽象成两个盘子,n-1 和 底下最大的1:n = (n-1) + 1

这个最简单的玩法如何实现呢?

  • 首先:把n-1 移到 缓冲区 -------过程1
  • 然后:把1 移到 终点 -------过程2
  • 最后:把缓冲区的n-1 移到 终点 -------过程3

03

过程1 如何实现?
还是召唤神器吧。
move(N,起点,缓冲区,终点)
此时,我们的起点是a,终点是b ,N=n-1,缓冲区只能是c了
move(n-1,a,c,b)
过程2呢?
move(1,a,b,c)
过程3呢?
move(n-1,b,a,c)

04

哦哦 神器的力量太大,止不住咋办。。

if (N == 1):
a -> c #此时我已经不需要缓冲区了


过程1-3是整个递归算法的核心。再抽象一点,即把大象装进冰箱拢共需要三步:

  • 打开冰箱门
  • 把大象装进冰箱
  • 关上冰箱门

oh my my,胜利的号角已经吹响,五星红旗在敌人的阵地上迎风招展!

实现递归的基本步骤

  • 1、实现一个功能需要 n 次递归调用;
  • 2、假设前面 n-1 次已经执行完毕;
  • 3、执行最后一步操作
  • 4、添加递归边界条件

判别递归使用场景

最后,什么时候需要用到递归呢?一个简单的判别方法是:当前的输入依赖上一步的输出,依次重复。

最后的最后,做一个小练习加深一下印象吧:

/* 
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。 
输入描述:
输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。输出描述:
输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符'1'和'2'。输入例子1:
>10输出例子1:
>12*/// TODO:// js实现// 最初实现思路
function createMagic(n) {let arr = [];function magicCoin(n) {// 递归边界if (n < 1 || n > Math.pow(10,9)) return;if (n === 1) return arr.push(1);if (n === 2) return arr.push(2);if (n % 2 === 0) {magicCoin((n - 2) / 2);arr.push(2);} else {magicCoin((n - 1) / 2);arr.push(1);}}magicCoin(n);return arr.join('')
}// 略微优化
function magicCoin(n) {if (n < 1) return;if (n % 2 === 0) {return magicCoin((n - 2) / 2) + '2';} else {return magicCoin((n - 1) / 2) + '1';}
}// testfor(var i = 1; i<20; i++) {console.log(i+': ' +createMagic(i));
}// 输出
1: 1
2: 2
3: 11
4: 12
5: 21
6: 22
7: 111
8: 112
9: 121
10: 122
11: 211
12: 212
13: 221
14: 222
15: 1111
16: 1112
17: 1121
18: 1122
19: 1211

敬请勘误指正!

转载于:https://www.cnblogs.com/fayin/p/8086790.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flock lock ex php,php – flock有可能用LOCK_EX返回false吗?

标签&#xff1a;phpBy default, this function will block until the requested lock isacquired在下面我发现了以下示例代码&#xff1a;$fp fopen("/tmp/lock.txt", "r");if (flock($fp, LOCK_EX)) { // acquire an exclusive lockftruncate($fp, 0); …

C++如何实现DNS域名解析转

C如何实现DNS域名解析 这片文章介绍了C如何实现DNS域名解析&#xff0c;还有对相关技术的介绍&#xff0c;代码很详细,需要的朋友可以参考下一、概述 现在来搞定DNS域名解析&#xff0c;其实这是前面一篇文章C实现Ping里面的遗留问题&#xff0c;要干的活是ping的过程中画红线的…

PHP程序中时间戳,php 时间戳常用代码

echo strtotime(date(Y-m-d));获取明天凌晨的时间戳代码&#xff1a;echo strtotime(date(Y-m-d,strtotime(1 day)));附上测试代码&#xff1a;echo strtotime(2012-11-2);echo strtotime(2012-11-2 00:00:00);echo strtotime(date(Y-m-d)),;echo date(Y-m-d H:i:s,strtotime(d…

Echarts入门

引用Echarts 方法1&#xff1a;下载echarts.js后&#xff0c;进行引用&#xff0c;如 <script src"echarts.min.js"></script> 方法2&#xff1a;在线引用&#xff0c;在线网址可为 http://echarts.baidu.com/dist/echarts.min.js R语言中有相应的R包…

高等代数第3版下 [丘维声 著] 2015年版_2020年成人高考 专升本 高等数学复习攻略...

成人高考的高等数学考试按照专业属性分为理工类和经管类&#xff0c;高等数学一直是成考中的比较不好拿分的科目&#xff0c;也是大家复习备考的难点。今天&#xff0c;小编给大家分享一些答题技巧和必备的公式&#xff0c;帮助大家一起来搞定高等数学&#xff0c;希望这份资料…

java虚拟机10.内存模型与线程

多任务处理在现代计算机操作系统中是一项必备的功能&#xff0c;让计算机同时去做几件事情&#xff0c;不仅是因为计算机的运算能力强大了&#xff0c;更重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大&#xff0c;大量的时间都花费在磁盘I/O&#xff0c;网…

php仿微信上传图片压缩,PHP仿微信多图片预览上传实例代码

生产图片区域&#xff0c;上传按钮#btn可替换自己想要的图片plupload上传var uploader new plupload.Uploader({//创建实例的构造方法runtimes: html5,flash,silverlight,html4, //上传插件初始化选用那种方式的优先级顺序browse_button: btn, // 上传按钮url: "ajax.php…

笔记本电脑如何保养_嘉兴专业笔记本电脑喷漆加工厂价格实惠

嘉兴专业笔记本电脑喷漆加工厂价格实惠 [xznugcbx]不宜大量储存或久存&#xff0c;做好通风设施。自喷漆如果大量泄露操作人员应迅速撤离泄露污染区人员到安全区域&#xff0c;因罐内的二甲醚气体具有轻微的毒性&#xff0c;并将污染区域进行隔离&#xff0c;罐内的气体跟空气中…

css 滤镜之AlphaImageLoader

CreateTime--2017年12月25日17:05:37 Author:Marydon ie滤镜特效之AlphaImageLoader 作用&#xff1a; 用于设置背景图片特效样式 使用条件&#xff1a; IE8及以下版本不支持属性background-size&#xff0c;可以使用AlphaImageLoader来代替 语法&#xff1a; filter : progid:…

java font属性,css font-family属性怎么用

原标题&#xff1a;css font-family属性怎么用css font-family属性怎么用&#xff1f;属性定义及使用说明font - family属性指定一个元素的字体。font-family 可以把多个字体名称作为一个"回退"系统来保存。如果浏览器不支持第一个字体&#xff0c;则会尝试下一个。有…

企业是否应该实现对客户需求的快速响应_互联网企业的数据化迭代和数据化应用...

数字时代&#xff0c;品牌和消费者正经历数字化的变革&#xff0c;谁能真正实现企业数据赋能&#xff0c;谁就是残酷市场竞争下的优胜者。企业需要加快实现全数据治理工具的研发&#xff0c;用数据推动企业发展。本文作者结合案例分享了关于企业数字化的方法论与感知响应模型&a…

jmeter自定义并发用户数图形插件介绍

Stepping Thread Group马上要被废弃了&#xff0c;废弃原因不知道&#xff0c;官方推荐使用 BlazeMeter Inc.公司贡献的插件Concurrency Thread Group&#xff0c;配合 Throughput Shaping Timer使用&#xff0c;可以达到相同的自定义并发用户的图形效果 1、stepping插件地址 …

matlab里数据类型转换,Matlab数据类型及转换(Matlab data type and conversion).doc

Matlab数据类型及转换(Matlab data type and conversion)Matlab数据类型及转换(Matlab data type and conversion)Matlab data type and conversion (2011-05-1615:10:59)Label: miscellaneous: memosIn Matlab, there are 15 basic data types, mainly integer, floating poin…

windows server 触屏_宜昌触屏万能蒸烤箱价格-华春新能源有限公司

首页 > 新闻列表 > 浏览文章发布时间&#xff1a;2020-10-27 08:47:06 浏览量&#xff1a; 5导读&#xff1a;华春新能源有限公司为您提供宜昌触屏万能蒸烤箱价格的相关知识与详情&#xff1a; 所述水箱与水较少时的水位达到一个比预定热气体电磁阀被打开时系统压力平衡…

matlab s参数转换y参数,晶体管的h参数、y参数和S参数(修订版,包含使用Matlab将S参数换算为y参数的方法)...

笔者注&#xff1a;文中“晶体管”指普通双极型晶体管(BJT)&#xff0c;“场效应管”指场效应晶体管(FET)。目前小功率硅晶体管的特征频率(fT)一般都在100MHz以上&#xff0c;既可用于低频小信号放大器&#xff0c;也可用于高频小信号放大器。同样一只晶体管&#xff0c;用于低…

3ds Max制作碗实例教程

一、 碗的建模。模型的结果如图WB—1所示&#xff1a; 图WB—1 1. 创建圆柱&#xff0c;并调节参数&#xff0c;转换到多边形&#xff0c;最终的结果图WB—2所示&#xff1a; 图WB—2 2.使用Inset&#xff08;插入&#xff09;插入一个面&#xff0c;再次执行Extrude&#xff0…

unity hub服务器无响应_累积更新KB4541335反馈称无法安装 出现无响应情况

几天前微软面向Windows 10 Version 1903/Version 1909功能更新&#xff0c;发布了累积更新KB4541335&#xff0c;主要改善了开始菜单和文件管理器。不过部分用户在Feedback Hub上反馈无法安装该更新&#xff0c;过程中会收到错误信息。用户反馈称会收到“2020-03 Cumulative Up…

php访问mysql函数吗,PHP访问MySQL数据库函数简介

PHP访问MySQL数据库函数简介PHP访问MySQL数据库函数简介1. 进行数据库连接连接数据库服务器&#xff0c;就是客户端向己运行的数据库服务器发出连接请求&#xff0c;成功以后就可以对数据库进行相应操作&#xff0c;由于用户的权限不同&#xff0c;所能进行的操作也不一样。PHP…

工具资源 Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore

内容转载自&#xff1a;http://www.importnew.com/21889.html#comment-636799 转载于:https://www.cnblogs.com/qinshou/p/8119693.html

电脑二维码怎么扫描_扫描模组方案是如何满足多种应用场景需求?

随着自动识别技术的发展&#xff0c;扫描模组逐渐成为各个领域上的配套&#xff0c;然而很多人还停留在“主扫”的观念上&#xff0c;殊不知如今的“被扫”更受人们的欢迎&#xff0c;即采用硬件解码的方式去识读条形码或二维码。远景达作为扫描模组方案公司&#xff0c;在不断…