1. 程式人生 > >Python例項淺談之四遞迴求斐波那契、階乘、累加和

Python例項淺談之四遞迴求斐波那契、階乘、累加和

一、問題

指令碼遞迴求斐波那契、階乘和、累加和函式的執行。先在單執行緒中執行這三個函式,然後在多執行緒中做同樣的事,以說明多執行緒的好處。以及子類化threading執行緒模組的Thread類,靈活地來自定義執行緒物件。

二、解決

1、程式碼

#!/usr/bin/env python

import threading
from time import time, ctime, sleep

class MyThread(threading.Thread):
    def __init__(self, func, args, name=''):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args

    def getResult(self):
        return self.res

    def run(self):
        print 'starting', self.name, 'at:', ctime()
        self.res = apply(self.func, self.args)
        print self.name, 'finished at:', ctime()

def fib(x):
    sleep(0.005)
    if x < 2: return 1
    return (fib(x-2) + fib(x-1))

def fac(x):
    sleep(0.1)
    if x < 2: return 1
    return (x * fac(x-1))

def sum(x):
    sleep(0.1)
    if x < 2: return 1
    return (x + sum(x-1))

funcs = (fib, fac, sum)
n = 12

def main():
    nfuncs = range(len(funcs))

    print '*** SINGLE THREAD'
    for i in nfuncs:
        print 'starting', funcs[i].__name__, 'at:', ctime()
        print funcs[i](n)
        print funcs[i].__name__, 'finished at:', ctime()

    print '\n*** MULTIPLE THREADS'
    threads = []
    for i in nfuncs:
        t = MyThread(funcs[i], (n,), funcs[i].__name__)
        threads.append(t)

    for i in nfuncs:
        threads[i].start()

    for i in nfuncs:
        threads[i].join()
        print threads[i].getResult()

    print '--all DONE at:', ctime()

if __name__ == '__main__':
    main()
       在這個多執行緒程式中,分別在單執行緒和多執行緒環境中,執行三個遞迴函式。在單執行緒中執行只要簡單地逐個呼叫這些函式,在函式結束後,顯示對應的結果;在多執行緒中,不馬上顯示結果,等到要結束時才會呼叫 getResult()函式,並在最後顯示每個函式的結果。Thread的子類更為通用,把子類單獨放在一個模組中。

2、執行結果圖


三、總結

(1)在每個函式中加上一個sleep()函式,讓為了讓函式慢下來,以便於能方便地看到多執行緒能在多大程度上加速程式的執行。在實際的開發中應用中可以去掉sleep()函式。
(2)執行緒中的臨界資源(臨界區)、鎖機制、條件變數、訊號量、同步佇列等機制在實際開發中還需總結。
(3)若有不足,請留言,在此先感謝!

相關推薦

Python例項累加

一、問題 指令碼遞迴求斐波那契、階乘和、累加和函式的執行。先在單執行緒中執行這三個函式,然後在多執行緒中做同樣的事,以說明多執行緒的好處。以及子類化threading執行緒模組的Thread類,靈活地來自定義執行緒物件。 二、解決 1、程式碼 #!/usr/bin/

Python—用列表數列

1.生成前10個斐波那契數(Fibonacci),要求將這些整數存於列表L中,最後打印出這些數[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] (斐波那契數的前兩個是1,1,之後的數是前兩個數的和) 方法1:使用列表 L=[1,1] while len(L)<

斐波那契數是第一個數和第二個數都為1,從第三個數開始,後面的是是前面相鄰兩個數的和。定義的函式如下所示: int fib(int m) {     if (m == 1 || m == 2)         

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int fib(int n) { int a = 1; int b = 1; int c = 0; if (n <= 2) re

Java面向物件——用數列

1.用非遞迴方式求斐波那契數列: package Hello; public class Test { public static void main(String[] args) {

java數列第n項

public class Fibonacci { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int f

數列

int f (int n) {     if(n==1||n==2)         return 1;         else          return f(n-1)+f(n-2); } #include<stdio.h> int main() {  

python 方法 數列—漢諾塔

#普通方法生成 def feibo(n): a,b=0,1 print('0,1',end='') for i in range(n-1): a,b=b,a+b print(',{0}'.format(b),end='') #遞迴方法生成 def

python 迭代法 實現演算法

題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少? 1.程式分析: 兔子的規律為數列1,1,2,3,5,8,13,21…. 由規律可知: f(n) = f(n-1)+f(n-2) 符合斐波那契數

Python輸出數列

今天學習Python的時候做一道練習題,題目是這樣的: 題目 匯入 問題 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總對數為多少? 分析 簡單的分析了一下,發現這個問題

如何使用Python方法來實現組合數,實現

組合數公式: C(n,m)=n!/((n-m)!*m!) 傳統演算法 def CombinationNum(n,m):     #n>=m n,m都是自然數     #找到一個出口     if m == 0 or n == m:         return

C語言經典演算法(八)——實現數列的兩種方法

後繼續整理演算法並寫出自己的理解和備註。 C++實現的:遞迴實現斐波那契數列 1、 遞迴實現斐波那契數列Fib(n) <1> 題目描述:輸入n值,求解第n項的斐波那契數列值 <2> 方法一:概念法 <3> 方法二:遞迴法 斐波那契數列值是值1

實現數列

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列

用for迴圈\遞數列

for迴圈 public class Test{ public static int fib(int n){ if(n == 1 || n == 2){ return 1; }else{ int a = 1; int b = 1; int s = 0; for

使用實現列數中的20個月有多少隻兔子

package it.casts.homework; //5.使用遞迴實現斐波那契列數中的20個月有多少隻兔子; public class Test05 { public static void main(String[] args) { int method = method(20);

數列(兔子總數)。

反覆學習反覆學習。 因為自己對遞迴還是不太熟練,於是做POJ1753的時候就很吃力,就是翻棋子直到棋盤上所有棋子的顏色一樣為止,求最少翻多少次,方法是列舉遞迴。然後就打算先做另一道遞迴的題(從陣列中取

java實現數列

/** *create Date:2016-12-23 *modified Date:2016-12-23 *modified by:shark *Description:斐波那契數列 **/ public class Shulie{public static long d

使用JavaScript實現解決數列及優化

遞迴的概念:若一個演算法直接地或間接地呼叫自己本身,則稱這個演算法是遞迴演算法(《資料結構—使用C語言實現;朱戰立;西安交大出版社》); 遞迴的兩個條件:自己呼叫自己和有結束條件(否則是死遞迴) 斐波那契數列 1, 1, 2,3,5,8,13,21….. 使

數列

#include<stdio.h> long Fib(int n); int count;//計算函式被呼叫的次數 int main() { int n,i,x; printf("Input n:"); scanf("%d",&n); for(i=1;i<=

演算法

1 遞迴   把遞迴想成方法棧,後進先出。遞:一層一層深入(依次執行前置程式碼),直到到達遞迴終止條件(一定要有終止條件,不再執行自己),歸:再從底層一層一層返回(依次執行後置程式碼)。 快速排序:典型的遞迴前置思想,先執行取中分邊,再左右向下遞迴 歸併排序:典型的遞迴後置思想