斐波拉契数列

Python

用Python写斐波拉契数列。斐波拉契(Fibonacci)数列,除第一个和第二个数以外,后面的数字由前面两个数相加得到。

1. 简单输出

def fab(n):
    i, a, b = 0, 0, 1
    while i < n:
        print(b)
        a, b = b, a + b
        i += 1

2. 显然,上面的程序只能打印,复用性很差,返回一个List会好一点:

def fab(n):
    i, a, b = 0, 0, 1
    l = []
    while i < n:
        l.append(b)
        a, b = b, a + b
        i += 1
    return l

然后打印:

for n in fab(5):
    print(n)

3. 2中生成List的方法,空间复杂度为O(n),考虑用迭代器实现(iterable),空间复杂度会是O(1)。

通过__iter__()方法可以将类变成可迭代的类,而迭代器用__next()__实现

class Fab(object):
    def __init__(self, n):
        self.n = n
        self.i, self.a, self.b = 0, 0, 1

    def __iter__(self):
        return self

    def __next__(self):
        if self.i < self.n:
            r = self.b
            self.a, self.b = self.b, self.a + self.b
            self.i += 1
            return r
        raise StopIteration()

for循环中会自动调用next方法,返回下一个数。

4. 用yield关键字可以简化3中的代码

yield关键字可以把一个函数变成一个生成器(generator),对函数执行到yield时,会返回一个迭代值,下次之迭代时,代码从yield下一行继续执行,函数的内部变量和上次中断前一样。
由于函数被生成了generator,该对象也具有next()方法

def fab(n):
    i, a, b = 0, 0, 1
    while i < n:
        yield b
        a, b = b, a + b
        i += 1

Java

1. 普通

最基础的。

    public static void showFab(int n) {
        int a = 0, b = 1;
        for (int i = 1; i <= n; i++) {
            System.out.println(b);
            b = a + b;
            a = b - a;
        }
    }

2.递归

用上递归

    public static int showFab(int n) {
        if (n == 1 || n == 2) {
            return 1;
        } else {
            return showFab(n-1)+showFab(n-2);
        }
    }

3. 迭代器实现

考虑到上面两种方法要输出很多位的话都很占内存,用迭代器写一个不怎么占内存的。

public class FibonacciTest implements Iterator {
    private BigDecimal a = BigDecimal.ZERO;
    private BigDecimal b = BigDecimal.ONE;
    private int n, i = 0;

    public FibonacciTest(int n){
        this.n = n;
    }

    @Override
    public boolean hasNext() {
        return i < n;
    }

    @Override
    public BigDecimal next() {
        BigDecimal temp = a.add(b);
        b = a.add(b);
        a = b.subtract(a);
        this.i++;
        return temp;
    }

    public static void main(String[] args) {
        FibonacciTest f = new FibonacciTest(1000);
        while(f.hasNext()){
            System.out.println(f.next());
        }
    }
}

你可能感兴趣的:(斐波拉契数列)