A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

斐波那契数列 1,1,2,3,5,8,13,21....
通项公式 fib(n) = fib(n-1) + fib(n-2)
1. 普通迭代
...
2. 普通递归
[Java] 纯文本查看 复制代码
private static long fib(int n){
	return n<=2?1:(fib(n-1)+fib(n-2));
}


3. 带缓存的递归
        
[Java] 纯文本查看 复制代码
static Map<Integer,Long> cache2 = new HashMap<>();
        private static long fib2(int n){
		if(n <= 2) return 1L;
		if(cache2.containsKey(n))
			return cache2.get(n);
		Long fibn = fib2(n-1)+fib2(n-2);
		cache2.put(n, fibn);
		return fibn;
	}


4. 使用 BigInteger 防止溢出
[Java] 纯文本查看 复制代码
static Map<Integer, BigInteger> cache = new HashMap<>();
	public static void main(String[] args) {
		int n = 100;
		BigInteger bi = fib(n);
		System.out.println(bi);
	}

	private static BigInteger fib(int n) {
		if(n <= 2) return BigInteger.ONE;
		if(cache.containsKey(n))
			return cache.get(n);
		
		BigInteger t = new BigInteger(fib(n-1).toByteArray()).
				add(new BigInteger(fib(n-2).toByteArray()));
		cache.put(n, t);
		return t;
	}

5. 斐波那契数列迭代器
[Java] 纯文本查看 复制代码
/**
 * 定义一个遍历器,用于遍历斐波那契数字。
 * 
 * @author moveb
 *
 */
public class T24_13_FibonacciIterator implements Iterator<Integer> {
	private int upBound = 23302;
	private int pre = 1;
	private int cur = 1;
	
	public T24_13_FibonacciIterator(){}
	
	public T24_13_FibonacciIterator(int ub){
		upBound = ub;
	}
	
	@Override
	public boolean hasNext() {
		return (cur < upBound);
	}

	@Override
	public Integer next() {
		int fib = cur;
		cur = cur + pre;
		pre = fib;
		return fib;
	}

	@Override
	public void remove() {
		
	}
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马