題目1
已知一個數列:1、1、2、3、5、8、13、……,其規律為從第3項開始,每一項都等於其前兩項的和,這個數列就是斐波那契數列。
請求出符合斐波那契數列規律的第11項。
代碼實現--非遞歸
def fib_show(n):
a, b = 0, 1
while n > 0:
a, b = b, a + b
n -= 1
return a
print("斐波那契數列 第11項:{}".format(fib_show(11)))
代碼實現--遞歸
def fib_recursive(n):
if n == 1 or n == 2:
return 1
return fib_recursive(n - 1) + fib_recursive(n - 2)
print("斐波那契數列 第11項:{}".format(fib_recursive(11)))
注意:遞歸方式實現起來比較簡潔,但其效率較低,不推薦。
題目2
請求出符合斐波那契數列規律的前11項。
代碼實現一
def fib_show(n):
a, b = 0, 1
while n > 0:
if n == 1:
print(b)
else:
print(b, end=", ")
a, b = b, a + b
n -= 1
fib_show(11)
代碼實現二
def fib_show(n):
if n == 1:
return "1"
if n == 2:
return "1, 1"
res = [1, 1]
for i in range(2, n):
res.append(res[-1] + res[-2])
return ", ".join([str(i) for i in res])
print("斐波那契數列 前11項:{}".format(fib_show(11)))
題目3
對於斐波那契數列:1、1、2、3、5、8、13、……。我們把其數列中的數稱為斐波那契數(Fibonacci數)。
如果給定一個數N,需要讓其變為一個Fibonacci數,每一步可以把當前數字N變為N-1或者N+1,那么請求出最少需要多少步,才可以把N變為Fibonacci數。
例如:
給定一個數15,與其相鄰的兩個Fibonacci數分別為 13 和 21 ,那么這個數15要變為 13 需要兩步,變為 21 則需要六步,所以在這里最少需要兩步。
實現思路
- 分別求出與所指定數相鄰的兩個Fibonacci數:a 和 b
- 分別求出所指定數與 a 和 b 的距離步數 left_step 和 right_step
- 對比 left_step 和 right_step,數值最小的即為所需的最小步數
代碼實現
def fib_step(num):
a, b = 0, 1
min_step = 0
while True:
# 當 b 大於輸入的數 num 時,a 就是上一次循環的 b ,此時 a 肯定小於 num
if num >= a and num <= b:
left_step = num - a
right_step = b - num
if left_step < right_step:
min_step = left_step
else:
min_step = right_step
break
a, b = b, a + b
return min_step
print("如果把 15 變為Fibonacci數,最少需要 {} 步".format(fib_step(15)))