java斐波那契 递归_斐波那契数的递归与非递归实现

效率问题的方法就是采用非递归的方式。

非递归的思想 当n =1 或者 n=2的时返回1。当n大于2时,通过for循环改变值来实现。

如:初始化两个变量num1 = 1, num2 =1,把它们想象成f(1) 和 f(2),在循环体中改变它们对应的值。把num2的值表示成num1, num2的值用num1与num2的和来表示。这样一来, num2就是f(n)的结果。

00df69629ef1cc0daca84b3b7edd8d99.png

非递归实现比较快,一般在0.0秒级。

解决数值溢出的方法是采用BigInteger来实现。

f(500) = 139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125

Time Elasped:0.0秒

递归与非递归的代码如下:

import java.math.BigInteger;

public class Fibonacci {

/**

*

* 采用递归方法实现

*

* 用int类型的话,最多可以计算出f(46) = 1836311903, 计算f(47)时就会产生溢出。

* f(42) = 267914296

* f(43) = 433494437

* f(44) = 701408733

* f(45) = 1134903170

* f(46) = 1836311903

* f(47) = -1323752223

*

*

* @return 返回第n个斐波纳契数

*/

public int fibonacci1(int n) {

if (1 == n || 2 == n) {

return 1;

} else {

return fibonacci1(n - 1) + fibonacci1(n - 2);

}

}

/**

*

* 采用非递归方法实现,效率比递归方法要高很多。

*

* 用int类型的话,最多可以计算出f(46) = 1836311903, 计算f(47)时就会产生溢出。

* f(42) = 267914296

* f(43) = 433494437

* f(44) = 701408733

* f(45) = 1134903170

* f(46) = 1836311903

* f(47) = -1323752223

*

*

* @return 返回第n个斐波纳契数

*/

public int fibonacci2(int n) {

if (1 == n || 2 == n) {

return 1;

}

int num1 = 1;

int num2 = 1;

int temp = 0;

for (int i = 2; i < n; i++) {

temp = num2;

num2 += num1;

num1 = temp;

}

return num2;

}

/**

*

* 采用递归方法实现

*

* 用long类型的话,最多可以计算出f(92) = 7540113804746346429, 计算f(93)时就会产生溢出。

* f(90) = 2880067194370816120

* f(91) = 4660046610375530309

* f(92) = 7540113804746346429

* f(93) = -6246583658587674878

*

*

* @return 返回第n个斐波纳契数

*/

public long fibonacci3(int n) {

if (1 == n || 2 == n) {

return 1;

} else {

return fibonacci3(n - 1) + fibonacci3(n - 2);

}

}

/**

*

* 采用非递归方法实现,效率比递归方法要高很多。

*

* 用long类型的话,最多可以计算出f(92) = 7540113804746346429, 计算f(93)时就会产生溢出。

* f(90) = 2880067194370816120

* f(91) = 4660046610375530309

* f(92) = 7540113804746346429

* f(93) = -6246583658587674878

*

*

* @return 返回第n个斐波纳契数

*/

public long fibonacci4(int n) {

if (1 == n || 2 == n) {

return 1;

}

long num1 = 1;

long num2 = 1;

long temp = 0;

for (int i = 2; i < n; i++) {

temp = num2;

num2 += num1;

num1 = temp;

}

return num2;

}

/**

*

* 采用非递归的方式来实现,同时采用BigInteger来实现。

*

*

* @return 返回第n个斐波纳契数

*/

public BigInteger populateWithoutRecursion(int n){

if (1 == n || 2 == n) {

return new BigInteger("1");

}

BigInteger num1 = new BigInteger("1");

BigInteger num2 = new BigInteger("1");

BigInteger temp = new BigInteger("0");

for(int i=2;i

temp = num2;

num2 = num2.add(num1);

num1 = temp;

}

return num2;

}

public static void main(String[] args) {

Fibonacci f = new Fibonacci();

long start = System.currentTimeMillis();

System.out.println( f.populateWithoutRecursion(500));

long end = System.currentTimeMillis();

System.out.println("Time Elasped:" + (end - start)/1000.0 + "秒");

}

}

3611124b37b4fcc6edfda84b651f06fb.png

大小: 68.1 KB

2

1

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2013-05-03 22:29

浏览 4604

评论

1 楼

zenghuiss

2015-07-24

非递归时,要<=n才行哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值