动态编程与迭代编程
兔子数列问题:一对兔子,刚出生不产仔,以后每月产一对,问10个月后有多少对兔子
解一(错误的解法):f(n )=f( n-1) +f( n-2)
这里隐藏着递归常见的效率低的问题,计算Fn-1的时候计算了Fn-2,计算Fn-1的时候计算了Fn-2,这个问题可以演变成动态编程,和迭代编程都可以在O(n )复杂度内解决,
动态编程的思路就是把结果作为参数传进来;
迭代是把兔子分为老兔子和小兔子:今年的老兔子数量=去年小兔子的数量+老兔子,不需要在函数里调函数。
递归是分治的核心,把问题一分为2,菲波纳切出列的问题就是分的界限重叠了。
兔子问题有很多种解法,一般都是先说递归这样的错误解法,比如在一个没排序的数组中找某个值,递归可以这样做:F( 数组)=F(前半) + F(后半 )直到前半后半不可再分为止,这样的做法不能提高速度,但是是解决问题的一个有效的思路,可以缩短代码;
分治法:从6*6棋盘的一角走到另外一角,输出12步的全部走法,最短路线是10步,那么12步肯定拐弯了。F(N点,路线,步数)=四个方向的F(N+1点,N+1路线,N+1步数),这样的递归就是动态编程,因为他把结果做为参数,每次在前一次的结果中判断是否经过了某个点。非拨纳切的问题也可以这样,每次判断F(n-2)是否被计算过了,就避免了重复计算。
计算围棋的死活问题:
1,某个棋子不和空地连通
2,和他连通的己方棋子不和空地连通
http://www.dullwolf.cn/weiq.asp 这里都是用到了动态递归编程。
好比孙悟空,走到一个地方要撒泼尿,写上“老孙到此一游”,下次来这里直接取结果,不重新计算。
1,原始输入条件是全局变量,因为要跨函数
2,函数参数中必须包含上次计算结果
浙公网安备 33010602011771号