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());
}
}
}