日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python查询斐波那契数列通项公式_斐波那契数列求解总结(Python版)

發布時間:2025/3/15 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python查询斐波那契数列通项公式_斐波那契数列求解总结(Python版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在查閱斐波那契數列時,看到下面的文章,總結得非常好,于是自己上手使用 Python 練習并實現多種求解方法

守望:面試官問你斐波那契數列的時候不要高興得太早?zhuanlan.zhihu.com

斐波那契數列的定義:

斐波那契數列 又稱黃金分割數列,指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........ 這個數列從第3項開始,每一項都等于前兩項之和

根據定義遞歸求解

已知:Fib(0) = 0,Fib(1) = 1
Fib(n) = Fib(n-1) + Fib(n-2)

# 根據定義遞歸求解 def Fib_definition(n):# 檢查輸入if check_input(n):if (n <= 1): return nreturn Fib_definition(n - 1) + Fib_definition(n - 2)# 默認返回值else:return -1

遞歸求解,避免重復計算已經出現過的元素

我們都知道,根據定義遞歸求解,會存在大量的重復計算,于是我們將已經計算過的值保存在數組里,這樣在后續需要計算時可以直接使用已經計算過的值,避免重復計算

# 遞歸求解,避免重復計算已經出現過的元素 def Fib_definition_notRepeat(n, fib_arr = [0, 1]):if check_input(n):# 檢查輸入if n < 2: return fib_arr[n]else:# 填充數組for x in range(n):fib_arr.append(-1)# 當求得 fib_arr[n-1] 時,fib_arr[n-2] 已知fib_arr[n] = Fib_definition_notRepeat(n-1, fib_arr) + fib_arr[n-2]return fib_arr[n]else:# 默認返回值return -1

遞推求解,從已知元素遞推所求元素

根據定義遞歸求解,我們是根據需要求得的元素一步一步倒推,直到倒推到我們已知的元素 ( 第 0 個,第 1 個 ),屬于“反向”計算,那如果“正向”計算,從已知元素遞推所求元素呢?

# 遞推求解,從已知元素遞推所求元素 def Fib_recurrence(n):# 檢查輸入if check_input(n):if n < 2:return nelse:index = 2fib_index_pre_pre = 0fib_index_pre = 1fib_index = 0while n >= index:fib_index = fib_index_pre_pre + fib_index_prefib_index_pre_pre = fib_index_prefib_index_pre = fib_indexindex += 1return fib_indexelse:# 默認返回值return -1

遞推求解,把已求得的元素放入數組中

def Fib_recurrence_arr(n):# 檢查輸入if check_input(n):if n < 2: return nelse:index = 2fib_arr = [0, 1]while n >= index:fib_arr.append(fib_arr[index-1] + fib_arr[index-2])index += 1return fib_arr[len(fib_arr)-1]else:# 默認返回值return -1

尾遞歸求解

如果不是很理解尾遞歸,請參見

什么是尾遞歸??www.zhihu.com# 尾遞歸求解 def Fib_tail_recursion(n, index, fib_pre_pre, fib_pre):# 檢查輸入if check_input(n):if n < 2: return nelse:if n >= index:fib_index = fib_pre_pre + fib_prefib_pre_pre = fib_prefib_pre = fib_indexindex += 1return Fib_tail_recursion(n, index, fib_pre_pre, fib_pre)else: return fib_preelse:# 默認返回值return -1

利用矩陣求解,所求元素為

中的 A[0][0], 或 中的 A[0][1]

由于以下式子變形后滿足定義

# 兩個n階矩陣相乘 def matrix_multiplication(n, A, B):C = []for line in range(n):line_arr = []for column in range(n):item = 0for i in range(n):item += A[line][i] * B[column][i]line_arr.append(item)C.append(line_arr)return C# 矩陣求解,所求元素為A^{n-1} 中的 A[0][0], 或 A^n 中的 A[0][1] def Fib_matrix(n):if check_input(n):# 檢查輸入if n < 2: return nA = [[1, 1], [1, 0]]result = [[1, 0], [0, 1]]matrix_n = 2while n > 0:result = matrix_multiplication(matrix_n, result, A)n -= 1return result[0][1]else:# 默認返回值return -1

矩陣快速冪求解,所求元素為

中的 A[0][0], 或 中的 A[0][1]

利用快速冪算法縮短計算次數

# 兩個n階矩陣相乘 def matrix_multiplication(n, A, B):C = []for line in range(n):line_arr = []for column in range(n):item = 0for i in range(n):item += A[line][i] * B[column][i]line_arr.append(item)C.append(line_arr)return C# 矩陣快速冪求解,所求元素為A^{n-1} 中的 A[0][0], 或 A^n 中的 A[0][1] def Fib_matrix_power(n):# 檢查輸入if check_input(n):if n < 2: return nA = [[1, 1], [1, 0]]result = [[1, 0], [0, 1]]matrix_n = 2while n > 0:# 判斷最后一位是否為1,即可知奇偶if n & 1:result = matrix_multiplication(matrix_n, result, A)A = matrix_multiplication(matrix_n, A, A)n //= 2# n = n >> 1return result[0][1]else:# 默認返回值return -1

通項公式求解

詳細推導過程可參考:

斐波那契數列為什么那么重要,所有關于數學的書幾乎都會提到??www.zhihu.com# 通項公式求解 import numpy import math def Fib_general_formula(n):denominator = math.sqrt(5)return int((numpy.power((1+denominator)/2, n) - numpy.power((1-denominator)/2, n)) / denominator)

利用Python生成器

因為這個不是所有語言都能夠使用,所以我放在了最后

# 利用 Python 生成器求解 def Fib_python_generator(n):a, b = 0, 1while n > 0:a, b = b, a + bn -= 1yield a # 獲取生成器的最后一個元素 def get_python_generator_item(n):item = 0for i in Fib_python_generator(n):item = ireturn item

代碼參考及下載

https://github.com/boxtsecond/Python-Practice/blob/master/FibonacciNumber.py?github.com

總結

以上是生活随笔為你收集整理的python查询斐波那契数列通项公式_斐波那契数列求解总结(Python版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。