fibonacci1.md 1.7 KB
Newer Older
F
feilong 已提交
1 2 3 4 5
# Python 斐波那契(fibonacci)(I)

数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子引入了数列0、1、1、2、3、5、8、13、21、34...,称为斐波那契数列(Fibonacci sequence),又称“黄金分割数列”或者“兔子数列”。使用函数递归或非递归的方式都可以方便地计算斐波那契函数:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2)

```python
F
feilong 已提交
6
# -*- coding: UTF-8 -*-
F
feilong 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

# TODO(You): 请实现递归计算斐波那契函数

if __name__ == '__main__':
    print(fibonacci(6))
```

请选出下面的 Python 斐波那契实现代码中,<span style="color:red">错误</span> 的选项。

## template

```python
def fibonacci(n):
    if n == 1 or n == 2:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)


if __name__ == '__main__':
    print(fibonacci(6))
```

## 答案

```python
def fibonacci_inner(n, r):
    if n == 1 or n == 2:
        return r

    return fibonacci_inner(n-1, fibonacci_inner(n-2, r))


def fibonacci4(n):
    return fibonacci_inner(n, 0)
```

## 选项

### A

```python
def fibonacci(n):
    if n == 1 or n == 2:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)
```

### B

```python
def fibonacci(n):
    if n == 1 or n == 2:
        return 1

    r = [1, 1]
    for i in range(2, n):
        r[1],r[0] = r[1]+r[0],r[1]

    return r[1]
```

### C

```python
def fibonacci_inner(n, m, r0, r1):
    if m == n:
        return r1

    return fibonacci_inner(n, m+1, r1, r0+r1)


def fibonacci(n):
    return fibonacci_inner(n, 2, 1, 1)
```

### D

```python
def fibonacci(n):
    from math import pow, sqrt
    return int(1/sqrt(5)*(pow((1+sqrt(5))/2, n)-pow((1-sqrt(5))/2, n)))
```