本站首页    管理页面    写新日志    退出

公告

You are all my reasons! 

桃李花林又一在

淫荡一日同风起,风骚直上九万里

仙子凌波微步罗衫飘忽十步一回头

我的最爱:网游,程序,文学

QQ:89636669


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:一维空间
日志总数:163
评论数量:248
留言数量:33
访问次数:649698
建立时间:2007年10月24日




 [算法]Fibonacci数列

dskongenius 发表于 2007/12/20 22:38:07

快速Fibonacci数算法(Fib_Quick)在非递归的Fibonacci程序中,在算f(n)的时候最多不超过n-2个加法,请编写一个更快的程序,或许可以用乘法。如果每一个乘法用m单位时间,每一个加法用p单位时间,于是非递归的写法因为最多有n-2个加法,因此最多用(n-2)×p的时间。请问,改良程序要用多少时间?假设只考虑加法和乘法。解答:考虑:f(n) = f(n-1) + f(n-2) = 1×f(n-1) + 1×f(n-2)f(n-1) = f(n-1) = 1×f(n-1) + 0×f(n-2)可以用矩阵乘法来表示两个式子:|f(n)   | = | 1 1 | ×|f(n-1)||f(n-1)|    | 1 0 |   |f(n-2)|  Fibonacci数列非递归解(Fib_Iteration)Fibonacci数列f1,f2,...,fn的定义如下:                fn =    1            n = 1                fn =    1            n = 2                fn = fn-1+fn-2   n > 2    请不要用递归方法,也不用数组,写一个函数,它接受n的值,传回fn。解答:这个问题比较简单,如果已经有fi-1和fi-2,那么fi = fi-1 + fi-2,下次计算fi+1时需要fi和fi-1,保留fi-1和fi的值,丢弃fi-2的值即可。代码:long int fib_iter(int n){    long int f1 = 1, f2 = 1;    long int temp;    int i;    if(n <= 2) return 1;    else    {        for(i = 3; i <= n; i++)        {           temp = f1 + f2;           f2 = f1;           f1 = temp;        }       return temp;    }}思考问题:(1)如果用传统的递归办法,程序如下所示long int fibonacci(int n){    if(n <= 2)   return 1;    else return fibonacci(n-1)+fibonacci(n-2);}请用n=13做输入,用手算方式看看有哪些计算是重复做过的。n = 13:1次;n = 12:1次;n = 10:2次;n = 9:3次;n = 8:5次;n = 7:8次;n = 6:13次;n = 5:21次;n = 4:34次;n = 3:55次;n = 2:88次;n = 1:143次;呈一个fibonacci数列的规律。(2)请问算fn时一共用了多少个加法?请导出一个公式。(3)k阶的Fibonacci数列问题:前k个数值=1,fi(k) = fi-1(k) + fi-2(k) + ... + fi-k+1(k)(i > k),当k=2时就是一般的Fibonacci数列。请不要用递归,或许可用数组,写一个函数fibK(n,k),接收n与k,算出fj(k)。(4)为什么函数要用unsigned long而不用int?


阅读全文(1679) | 回复(0) | 编辑 | 精华

 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.226 second(s), page refreshed 144772336 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号