前言:hello大家好,我是小白阿g今天更一期函数和递归的进阶特别篇,主要就是讲解一下这两个经典的问题,带大家更加深入的感受一下递归思想,主要还是讲解思路,还是那句话,我的努力哪怕为大家理解培养递归思想起到一点点作用,那也是值得的,话不多说,直奔主题。
1汉诺塔问题
关于汉诺塔问题可能有人没有听说过哈,简单给大家在网页上粘贴过来一个描述,如图:
简单的来说就是三个柱子ABC,A柱子上从小到大有一摞盘子,每次挪动一个,把盘子从A都挪到C上去,规则就是不能出现大盘子在小盘子上边的情况。
可能大家一开始看见这个题会觉得比较难,没有思路,现在我给大家重点讲解思路,依旧是递归大事化小思想,大问题咱们先不看,我们知道,如果A上只有一个盘子,是不是只需要一步就可以把它放到C上去,那么显然这就是大问题的最小子问题,即把大问题递减到A上只有1个盘子。那么假如有2个盘子,我们的挪法也是很简单的,那就是先把第一个放到B上去,这下A上就只有一个盘子了,也就是我们的最小子问题,我们把它放到C上就可以了,然后再把上的那个盘子放到C上去就完成了任务。那么我们现在基本就有了完整思路,那就是挪动n个盘子,我们可以先把n-1个盘子挪到B柱子上,这样A上就只剩1个盘子了,我们很容易就可以挪过去,挪到C之后,由于挪过去的是最大的盘子,剩下的所有盘子都是可以放在上面的,也就相当于剩余了一堆碟子在B上,A和C都是空的,那么就变成了n-1个盘子挪动的汉诺塔问题,至此我们就把n个盘子的汉诺塔问题变成了第一步n-1个盘子从A挪到B,第二步A上剩的一个盘子挪到C上,第三步再把n-1个盘子从B挪到C上的汉诺塔问题。这样递减下去,肯定会变成我们的最小子问题:把盘子从A放到C上去,然后再逐级归还,这样问题就解决了。再来完整捋一下思路:n个盘子移动的汉诺塔问题,把n分解成最大的盘子和n-1个盘子的子问题,最大的盘子我们可以直接挪动,剩下的n-1个盘子我们可以调用自身,即规模减小的汉诺塔问