编程之美2.9 斐波那契数列
Posted jhcelue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程之美2.9 斐波那契数列相关的知识,希望对你有一定的参考价值。
斐波那契数列是我们在学习C语言的时候。在递归那一章的经典实例。当然,还会有汉诺塔的样例。
这个问题时这样定义的:
0 (x <= 0)
f(x) = 1 (x == 1)
f(x - 1) + f(x - 2) (x > 1)
看到这个递推公式后。我们非常easy能够写出例如以下的代码:
函数声明:
typedef long long ll;
ll DutFibonacci_1(int);
函数定义:
/*经典的斐波那契数列的递归解法,并且每一个人都知道这样的方法效率非常低*/ ll DutFibonacci_1(int n) { if (n <= 0) return 0; else if (n == 1) return 1; else return DutFibonacci_1(n - 1) + DutFibonacci_1(n - 2); }
只是,当你输入一个比較大的 x 值后,你会发现,你等了非常久,还是没有不论什么输出,这就是递归效率低的问题。递归是利用栈的思想,一次次的入栈算它的前一个值,然后在一次次的出栈算它的后一个值,最后,得到终于的值(最后一个值)。
那么,我们能够知道,事实上这里须要保存函数的地址。各个參数的值等等一系列的操作,肯定是浪费了大量的时间和资源,所以。我们须要寻求第二种方法解决问题。
大多数递归的问题都是能够利用循环去解决的,所以,我们能够尝试的写出例如以下的循环求解代码:
函数声明:
ll DutFibonacci_2(int);
函数定义:
ll DutFibonacci_2(int n) { if (n <= 0) return 0; else if (n == 1) return 1; ll one = 1; ll two = 0; ll result = 0; /*非递归解法也非常简单。利用两个中间数,计算“以前”出现的值就能够了*/ for (int i = 2; i <= n; ++i) { result = one + two; two = one; one = result; } return result; }
以上是关于编程之美2.9 斐波那契数列的主要内容,如果未能解决你的问题,请参考以下文章
禅与计算机程序设计艺术使用 16 门编程语言实现斐波那契数列:循环控制指令与函数递归思想
谁能帮我用JAVA编写一个斐波那契数列,用eclipse实现,代码不对不采纳!