我认为递归的解法就是一个返回值问题,如果是用的函数递归,重点应该放在return上去,要求出递归的表达式。知道n-1能求出n的答案。以此类推。
要认为这是一个动态的问题,递归到最后只剩下最简单的求解时。就可以返回了。其关键点在于递归的表达式
分治的主要思想:
1.原问题可以分解为多个子问题来求解
2.子问题相互独立
3.子问题的解可以合为原问题的解
不可再分就求解
1.青蛙跳台问题
感觉青蛙跳台问题更像是递归来寻找可行解(通路)的问题。通过递归将底层的f(n-2)的答案汇集起来形成f(n-1)的答案。其递归表达式f(n)=f(n-1)+f(n-2)。当递归到最后,只有0,1,2三种情况时,可以直接返回此时的条约情况,最后得到解。青蛙跳台问题感觉可以想象成分散出取的路径数。你要做的就是统计其分散出取的路径数量即可。
2.找出伪硬币。找出伪硬币不同于青蛙跳台问题。其递归的表达式为f(n)=f(n/2)+1;return此表达式即可,这个更像是逐步的比较。
3。金块称重问题。金块的块数是2的n次幂,因此可以考虑同找出伪币相同的算法,只不过与之不同的是,金块问题对两个分组都要求解。可以考虑最开始一个袋子里面只有两个金块,然后逐步增加金块的数量每次比较f(n/2)后会返回给f(n)金块的数据,然后由上级的递归来比较得出金块的轻重。指的主义的是下层每次返回给上层的都是一个重一个轻,其递归方程可以考虑为f(n)=f(n/2)*2+2(比较一次轻的,比较一次重的。共两次)
4.残缺棋盘问题
当棋盘个数为2*2*2*2=16时,其可分为4个独立的小方块。并且最后在中间的含有四块的正方形必然会填进去一个三格板。当边长增大时,也可知必然会在中间填入一个三个版。也就是说可以考虑用分治算法,直接在中间的正方形先填入一个三个版。将棋盘分为4个残缺的正方形。采取递归的思想,到最后棋盘上只有残缺的正方形,直接填入三角板即可。