導航:首頁 > 編程語言 > pythonfib函數

pythonfib函數

發布時間:2024-12-12 18:26:45

『壹』 python中定義函數的使用方法

4.6. 定義函數
我們可以創建一個用來生成指定邊界的斐波那契數列的函數:
>>> def fib(n): # write Fibonacci series up to n
... """Print a Fibonacci series up to n."""
... a, b = 0, 1
... while a < n:
... print(a, end=' ')
... a, b = b, a+b
... print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
關鍵字 def 引入了一個函數 定義。在其後必須跟有函數名和包括形式參數的圓括弧。函數體語句從下一行開始,必須是縮進的。
函數體的第一行語句可以是可選的字元串文本,這個字元串是函數的文檔字元串,或者稱為 docstring。(更多關於 docstrings 的信息請參考 文檔字元串) 有些工具通過 docstrings 自動生成在線的或可列印的文檔,或者讓用戶通過代碼交互瀏覽;在你的代碼中包含 docstrings 是一個好的實踐,讓它成為習慣吧。
函數 調用 會為函數局部變數生成一個新的符號表。確切的說,所有函數中的變數賦值都是將值存儲在局部符號表。變數引用首先在局部符號表中查找,然後是包含函數的局部符號表,然後是全局符號表,最後是內置名字表。因此,全局變數不能在函數中直接賦值(除非用 global 語句命名),盡管他們可以被引用。
函數引用的實際參數在函數調用時引入局部符號表,因此,實參總是 傳值調用 (這里的 值 總是一個對象 引用 ,而不是該對象的值)。[1] 一個函數被另一個函數調用時,一個新的局部符號表在調用過程中被創建。
一個函數定義會在當前符號表內引入函數名。函數名指代的值(即函數體)有一個被 Python 解釋器認定為 用戶自定義函數 的類型。 這個值可以賦予其他的名字(即變數名),然後它也可以被當作函數使用。這可以作為通用的重命名機制:
>>> fib
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
如果你使用過其他語言,你可能會反對說:fib 不是一個函數,而是一個方法,因為它並不返回任何值。事實上,沒有 return 語句的函數確實會返回一個值,雖然是一個相當令人厭煩的值(指 None )。這個值被稱為 None (這是一個內建名稱)。如果 None 值是唯一被書寫的值,那麼在寫的時候通常會被解釋器忽略(即不輸出任何內容)。如果你確實想看到這個值的輸出內容,請使用 print() 函數:

『貳』 (python編程)使用函數輸出斐波那契數列:[-1, -1, -2, -3, -5, -8, -13, -21, -34, -55](添加到列表)

你看看你遞歸代碼的復雜度 是O(2^n) 而第二個的復雜度是O(n) 運行效率當然不同COUNTER = 0

def fibn(n):
global COUNTER
COUNTER += 1
if n == 0:
return 1
elif n == 1:
return 1
else:
return fibn(n-1) + fibn(n-2)

statistics = []

for i in range(35):
COUNTER = 0
fibn(i + 1)
statistics.append(((i + 1), COUNTER))

print statistics[(1, 1), (2, 3), (3, 5), (4, 9), (5, 15), (6, 25), (7, 41), (8, 67), (9, 109), (10, 177), (11, 287), (12, 465), (13, 753), (14, 1219), (15, 1973), (16, 3193), (17, 5167), (18, 8361), (19, 13529), (20, 21891), (21, 35421), (22, 57313), (23, 92735), (24, 150049), (25, 242785), (26, 392835), (27, 635621), (28, 1028457), (29, 1664079), (30, 2692537), (31, 4356617), (32, 7049155), (33, 11405773), (34, 18454929), (35, 29860703)]做了一個簡單的proflieimport cProfile
import pstats

def fibn(n):
if n == 0:
return 1
elif n == 1:
return 1
else:
return fibn(n-1) + fibn(n-2)

print ' i, calls, time'
for i in range(50):
pr = cProfile.Profile()
pr.enable()
fibn(i)
pr.disable()
stats = pstats.Stats(pr)
stats.strip_dirs()
st = stats.stats[('test1.py', 3, 'fibn')]
print '%3d, %10d, %8f' % (i, st[1], st[3])
i, calls, time 0, 1, 0.000000 1, 1, 0.000001 2, 3, 0.000003 3, 5, 0.000005 4, 9, 0.000008 5, 15, 0.000012 6, 25, 0.000020 7, 41, 0.000033 8, 67, 0.000165 9, 109, 0.000088 10, 177, 0.000141 11, 287, 0.000228 12, 465, 0.000450 13, 753, 0.000601 14, 1219, 0.001016 15, 1973, 0.003561 16, 3193, 0.002593 17, 5167, 0.004372 18, 8361, 0.007097 19, 13529, 0.011073 20, 21891, 0.018552 21, 35421, 0.032467 22, 57313, 0.051762 23, 92735, 0.095383 24, 150049, 0.133490 25, 242785, 0.212390 26, 392835, 0.352861 27, 635621, 0.578204 28, 1028457, 0.987839 29, 1664079, 1.506812 30, 2692537, 2.682802 31, 4356617, 3.998936 32, 7049155, 8.089419 33, 11405773, 13.058235 34, 18454929, 23.930004 35, 29860703, 36.503880目測fibn(50)要算出來需要兩周

『叄』 python的函數是怎麼執行的

n=0時執行到了for i in range(2,n),這個range是個空列表[],故一次也不會進入for循環執行「 fibs.append(fibs[-1] + fibs[-2])」,,直接返回[1,1],故不報錯

n=1返回[1]

n=2返回[1,1]

n=3及以上,進入for循環,fibs每次增加一個元素,其值為倒數第1個和倒數第2個元素之和

改為if...elif...else可以如下:

deffib(n):
ifn<1:
returnNone
elifn==1:
return[1]
elifn==2:
return[1,1]
else:
fibs=[1,1]
foriinrange(2,n):
fibs.append(fibs[-1]+fibs[-2])
returnfibs
print(fib(10))

『肆』 求解一道Python編程題

斐波那契數列自第三個數開始,每個數均為之前兩個數的和。

至少有兩種方法來實現它。

最常見的利用迭代的方法,其核心思路是

fib(n) =fib(n-1) +fib(n-2)

而在n<2時直接,沒有n-2,因此直接返回1:

def fib(num): return 1 if n<2 else fib(num-1) + fib(num-2)

這是一種很簡單的實現。在階梯數不大時,它很好用。當階梯數很大時,因為二次手迭代,會比較慢。因此,可以在計算中保存中間值(1至n-1的階梯數)來減少計算量:

這種方式在計算階梯數10000時就可以保持不錯的性能。如果需要多次計算該數列,則可以利用對象來保持這個中間值列表,下列代碼中,Fibonaci實例只計算未曾計算的階梯數,在重復調用時它更具優勢:

class Fibonaci(object):

....history=[1, 1]

....def cacl(self, num):

........while len(self.history) <= num:

............self.history.append(self.history[-1] + self.history[-2])

........returnself.history[num]

if __name__ == '__main__':

....fib =Fibonaci()

....print(fib.calc(100))

....print(fib.calc(32))

....print(fib.calc(10000))

『伍』 python3.4中fib(int(sys.argv[1]))是什麼意思如圖

就是調用fib函數

#可以分開表示成:
n=int(sys.argv[1])
#[pythonfibo.py1]這么執行
#sys.argv裡面存放的是命令行參數,argv[0]是腳本名(fibo.py),argv[1]里是第一個參數(1),因為獲取的是字元串,所以int轉為整形
fib(n)

如果解決老世了您仔含蘆的問題請念帶採納!
如果未解決請繼續追問

『陸』 利用遞歸函數求斐波那契值python版

首先我們要了解一下什麼是遞歸。

遞歸法,遞歸法就是利用上一個或者上幾個狀態來求取當前狀態的值(個人看法)。也可以說成函數自己調用自己的一種解決問題的策略。因此遞歸法通常是依託函數來實現的,遞歸函數總是會有一個出口,我們在解決遞歸問題時,只需要找出遞歸的關系式以及遞歸函數的出口(這兩個可以說是遞歸函數的核心了)。下面我將在這里舉求斐波那契值的例子帶領著大傢具體的實踐一下遞歸法。

很顯然遞歸函數的遞推式是:fib(n) = fib(n-1)+fib(n-2)。

遞歸函數的出口是當n為1時返回1,當n為0時返回0。

最後遞歸函數的核心代碼就可以寫出了:

然後總的代碼就是:

具體思路如下:

語句 return fib(n-1)+fib(n-2)的意思就是向前求斐波那契值,直到n-1=1,n-2=0

因為只有第1個和第0個斐波那契值是確定的

例:

當n=3時

第一次調用函數fib會執行第三條語句(因為n>1)這樣求回返回fib(2)+fib(1)

第二次調用函數時,因為2>1所有會返回fib(1)+fib(0);因為1不大於1,所以調用函數時

會執行第二條語句返回1值。

第三次調用函數,會執行第一和第二條語句,依次返回0和1從而求得fib(2)

fib(3)=fib(2)+fib(1)

fib(2)=fib(1)+fib(0)

即fib(3)=fib(1)+fib(0)+fib(1)=2*fib(1)+fib(0)

閱讀全文

與pythonfib函數相關的資料

熱點內容
教輔pdf 瀏覽:497
紅米手機加密文件怎麼解除 瀏覽:986
linux命令ping外網 瀏覽:144
單片機怎麼把程序導入亞龍視頻 瀏覽:517
outlook命令行參數 瀏覽:927
高考照片採集怎麼壓縮 瀏覽:374
可能的編譯警告信息 瀏覽:569
文件系統修復的命令 瀏覽:201
基於單片機任務書 瀏覽:950
解壓游戲過馬路 瀏覽:781
航海王為什麼伺服器不一樣 瀏覽:480
win10更新源碼怎麼關閉 瀏覽:964
在線png轉pdf 瀏覽:421
換手機用什麼app好 瀏覽:212
溫州java程序員接私活報價 瀏覽:555
我的世界如何保存別人的伺服器 瀏覽:128
飄的pdf 瀏覽:871
沒有壓縮功能了 瀏覽:249
總結派生曲線命令 瀏覽:418
pythonfib函數 瀏覽:895