递推、递归与迭代的本质,以及,辗转相除与斐波那契的惊人相似性

          在深入了解递推、递归、迭代的本质问题时,发现了一些有趣的东西,对“很多事物都有共性”这句话有了更深刻的体会。

 

           先说明“递推、递归、迭代”的同与异:其实三者在本质上没有任何差别;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)  最大公约数

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值