递归:好像相对高明,但其实效率而言递归并不是最佳方案。。
迭代:貌似复杂,其实性能更高效。
分而治之
DSA动态规划
所谓动态规划:就是通过递归,找出问题本质,并且给出一个初步的解之后,再将其等效的转换为迭代的形式。
- make it work
- make it right
- make it fast
两个栗子:
1. 斐波那契数列(青蛙跳台阶):
- 解决方法A:(记忆:memoization) 将已计算过实例的结果制表备查。
- 解决方法B:(动态规划) 颠倒计算方向:由自顶而下递归,为自地而上迭代。
2. 最长公共子序列:
对序列a[0,n] b[0,m] lcs(a,b) 无非三种情况:
- n=-1 or m=-1 , 则为空序列(“”)
- a[n] != b[m] 则 lcs(a[0,n], b[0,m)) 与 lcs(a[0,n), b[0,m])中取长者(末字符不同,扣掉)
- a[n] = b[m] = 'x' 则 lcs(a[0,n), b[0,m)) + 'x' # 末字符相同,都去掉,递归求解
总结:
递归:设计出可行且正确的解。
动态规划:消除重复计算,提高效率。