暴力递归
把问题转化为规模缩小了的子问题
有明确的不需要继续进行递归的条件(边界)
递归的code一点也不难,甚至很简单..
但是想出来怎么写怎么做真的好难...
汉诺塔问题
规则是:不能大压小,只能小压大
所以,把N层汉诺塔问题,变成这样
由此见得,其实高层的汉诺塔问题,都是无限累加的二层汉诺塔问题
都是
1-> another a
2-> another b
1-> another b
一、 从左到右的尝试模型
1 字符串
规定1和A对应,2和B对应...
那么一个字符串 111
可以变成 AAA AK KA
给定一个只有数字字符组成的字符串str,返回有多少种转化结果
2 背包
给定两个数组weight和values
weight[i]和values[i]分别代表 i号物品的重量和价值
给定一个正数bag,表示一个载重bag的袋子
求能装下最多的价值是多少
方法一
方法二
模型总结
这种从左到右的尝试,有点类似于初中数学中的追及问题
一个跑了... 后面还有多少... 总共占了多少...
index一直在往终点位置跑
然后已经跑过的路程先定义一个方法(比如已经占了多少价值,已经有了多少字符排列方式
再依次递归
(其实还是有点难理解 md
递归杀我
二、 范围上尝试的模型
纸牌问题
给定一个整型数组arr,代表数值不同的纸牌排成一条线
A和B依次拿走每张牌
规定A先拿,B后拿
但是每个玩家每次只能拿走最左或最右的纸牌
返回最后获胜者的分数
题目有点难以理解,直接举例子
这里所谓“先手”“后手”其实是被抽象化了的。
当轮到A拿的时候,A就是先手。当A拿完了,A又变成后手。
所以first函数那里有选择权:
拿arr[l]更大还是arr[r]更大
然后再累加后续A拿后手的
真的很抽象。。。举例说明吧
3,100,7这个数组
其中f、s都是A的过程,所以当A进入后手选择时,并不是A“主观”上的选择,是B留给A最小的那个值。
N皇后问题
一行只放一个皇后,一列也只能有一个..
感觉有点类似于矩阵中的行变换
只用一个一维数组就可以表示位置
因为一行只能有一个,比如 arr[0] = 7 说明0行的皇后位于7列
总结
我感觉目前看到这些递归例题有一个共同点:
都是
假设前面 多少多少 已经定好了
比如我现在在第一行,我假设前面没有定好的...
然后递归内部 再往后遍历...递归到第二行
第二行,假设第一行已经定好了
前面的背包问题也是类似如此
其实感觉某种意义上来说也是一种循环
明天开始就先不写这些东西了...
在学动态规划的过程中,突然对博弈论充满了兴趣
打算明天找一本博弈论相关的书籍读一下~