題目1
已知一個(gè)數(shù)列:1、1、2、3、5、8、13、……,其規(guī)律為從第3項(xiàng)開始,每一項(xiàng)都等于其前兩項(xiàng)的和,這個(gè)數(shù)列就是斐波那契數(shù)列。
請(qǐng)求出符合斐波那契數(shù)列規(guī)律的第11項(xiàng)。
代碼實(shí)現(xiàn)--非遞歸
def fib_show(n):
a, b = 0, 1
while n > 0:
a, b = b, a + b
n -= 1
return a
print("斐波那契數(shù)列 第11項(xiàng):{}".format(fib_show(11)))
代碼實(shí)現(xiàn)--遞歸
def fib_recursive(n):
if n == 1 or n == 2:
return 1
return fib_recursive(n - 1) + fib_recursive(n - 2)
print("斐波那契數(shù)列 第11項(xiàng):{}".format(fib_recursive(11)))
注意:遞歸方式實(shí)現(xiàn)起來(lái)比較簡(jiǎn)潔,但其效率較低,不推薦。
題目2
請(qǐng)求出符合斐波那契數(shù)列規(guī)律的前11項(xiàng)。
代碼實(shí)現(xiàn)一
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)
代碼實(shí)現(xiàn)二
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("斐波那契數(shù)列 前11項(xiàng):{}".format(fib_show(11)))
題目3
對(duì)于斐波那契數(shù)列:1、1、2、3、5、8、13、……。我們把其數(shù)列中的數(shù)稱為斐波那契數(shù)(Fibonacci數(shù))。
如果給定一個(gè)數(shù)N,需要讓其變?yōu)橐粋€(gè)Fibonacci數(shù),每一步可以把當(dāng)前數(shù)字N變?yōu)镹-1或者N+1,那么請(qǐng)求出最少需要多少步,才可以把N變?yōu)镕ibonacci數(shù)。
例如:
給定一個(gè)數(shù)15,與其相鄰的兩個(gè)Fibonacci數(shù)分別為 13 和 21 ,那么這個(gè)數(shù)15要變?yōu)?13 需要兩步,變?yōu)?21 則需要六步,所以在這里最少需要兩步。
實(shí)現(xiàn)思路
- 分別求出與所指定數(shù)相鄰的兩個(gè)Fibonacci數(shù):a 和 b
- 分別求出所指定數(shù)與 a 和 b 的距離步數(shù) left_step 和 right_step
- 對(duì)比 left_step 和 right_step,數(shù)值最小的即為所需的最小步數(shù)
代碼實(shí)現(xiàn)
def fib_step(num):
a, b = 0, 1
min_step = 0
while True:
# 當(dāng) b 大于輸入的數(shù) num 時(shí),a 就是上一次循環(huán)的 b ,此時(shí) 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 變?yōu)镕ibonacci數(shù),最少需要 {} 步".format(fib_step(15)))
更多Python編程題,等你來(lái)挑戰(zhàn):Python編程題匯總(持續(xù)更新中……)