在深入了解递推、递归、迭代的本质问题时,发现了一些有趣的东西,对“很多事物都有共性”这句话有了更深刻的体会。
先说明“递推、递归、迭代”的同与异:其实三者在本质上没有任何差别;f(n)= f(n-1)+f(n-2),这是一个递推公式,递推”反映的就是这种本质的关系,这也是我先说递推的原因,我们也常常说“递推关系”(recurrence relation);再说“递归”(recursion),递归常常用来定义概念与函数上,比如著名的递归定义:
GNU------GNU's Not Unix,也用递归来定义一个斐波那契数列的通项,
int Fibonacci(n)
{
if(n==1 || n==2)
return 1;
else
return Fibonacci(n-1)+Fibonacci(n-2);
}
显然递归有两个过程,1、把大问题一步一步往小问题分解,2、从最小的问题开始,根据递推关系一步一步得到新的解决方案,最后得到所得解。
所以,递归的本质其实还是递推关系,没有这个递推关系,就无法产生递归定义的合理性,合理性就是要求能够调用函数的本身,函数可以永远适用,这里面的思想就是使用一种相同的方法来描绘整个世界。只不过,递归还想强调一点分解的思想,这种思想在解决复杂问题中有非常重要的应用。有人说,递归反映的另一种思想应该是对函数自身的调用,我倒不是很同意,因为函数主体部分还是那个递推的规律,之所以能重复地调用函数自身,就是因为函数本身是一个规律的反映,就是说调用函数自身和使用相同规律是等价的,这种思想已经和递推关系重复了。
最后说“迭代”(iteration),对于斐波那契数列,先由1、1得2,再由1、2得3,然后由2、3得5,当你说他是迭代的时候,你主要在反映一种除了递推关系之外的思想,即输出量回头当输入量来使用,从而得出新的输出量,以新换旧,意即实现数据的更新操作,而且更新的方式都一样(就是递推关系)。
简言之,迭代是以递推的方式实现对数据的更新。
比如,2是f(n)=f(n-1)+f(n-2)的输出量,然后把2带入作为输入量使用,1+2=3,得到3这个新数,再把3当输入量,2+3=5,得到5.。。。。
所以,我说迭代的本质也是递推关系,只是他还想强调一些其他的东西,比如著名的分形几何的公式f(x)=x^2+C(C为常数),就是使用迭代法,给一个数得到一个值,再把这个值当做自变量带入得到一个新值,不停的迭代下去,得到一个数的集合(Mandelbrot set),这个集合在计算机图形学中有重要作用,同时分形几何也被发现是构成自然界的一个基本规则。
当迭代使得数据的更新越来越不明显(即数据之间的差别越来越小)的时候,这个数据越来越趋近于“完美”的时候,我们说这一系列的数据是收敛于一个确定值的,这种递推关系也有很高的要求。最重要的例子,就是非线性方程中的求解问题,我们先给出一个近似解,然后以某种递推关系不断地对这个近似解进行修补和刷新(这个过程就是迭代),得到的虽然是一系列的近似解,但是这些近似解会越来越接近我们想要的真解。所以,迭代的重大意义在于更新修补,而它修补的方式是不变的,即递推公式,足够多次的重复修补后,会给我们想要的结果。
===================好戏在下面=============================================
先写出斐波那契数列:1、1、2、3、5、8、13.。。。
考虑这些数列的时候,都先不要忘了“递推关系”这个本质,然后再根据需要想到其他的“思想”,比如递归的“分解”思想,迭代的“回代”思想。
前面已经说过,迭代反映的另一种重要思想就是输出量当做输入量的使用,在求解两个数的最大公约数的“辗转相除法(欧几里得法)”中,运用的就是这种迭代的思想:
int a,b; r = a%b; a = b; b = r; 比如14,12;12,2;2,0。
我们可以清楚的看到,对于所有的递推,无论他是递归,还是迭代,总是可以用一个数列来表达,像斐波那契数列那样,因为“本质”是递推,那么辗转相除法的背后是不是也隐藏着一个递推数列呢?当然!!!
比如:140, 58, 24, 10, 4, 2, 0
f(n) = f(n-2)%f(n-1)
天啊,这和斐波那契数列的递推公式是多么的相似啊,一个是前两项之和,一个是前两项之余!!!于是,这两个数列之间应该还会有更多的相似性,比如欧几里得数列的每相邻两项的最大公约数相同,(140,58)、(58,24)、(24 , 10)、(10,4)、(4,2)和(2,0),这一点欧几里得早在2000多年前就为我们证明过了,所以我们可以用这个数列的倒数第二项来当做140和58的最大公约数。
f(n) = f(n-2)%f(n-1)每相邻两项有一个共同的性质,那么f(n) = f(n-2)+f(n-1) 每相邻两项是不是也必有某种相同的性质呢?经过实证,这种关系确实存在,那就是著名的黄金比例0.618,即1:1,1:2,2:3,3:5,5:8,8:13.。。。。。
虽然一开始和0.618差的好像很远,但是经证实,这是一个比值收敛的数列,最终收敛于黄金比0.618。
多么令人振奋的发现,fibonacci数列竟然藏着这么一个美丽的大秘密,真是不得不佩服递推数列相似性的伟大作用啊!!
难怪曾听老师说过,1:1,1:2,2:3,3:5,5:8,8:13这种比值在大自然中随处可见,因为这些数值比是最美的,它们是“黄金比”!!!
==============================感叹===================================
我相信,造物主在创造世界的时候,肯定是使用了某种相同的规则,就像这样:
f(n) = f(n-2)+f(n-1)
1、1、2、3、5、8、13.。。。
1:1,1:2,2:3,3:5,5:8,8:13。。。黄金比
f(n) = f(n-2) % f(n-1)
140, 58, 24, 10, 4, 2, 0
(140,58)、(58,24)、(24 , 10)、(10,4)、(4,2)(2,0) 最大公约数