2014-09-19 45 views
0

我想做類似以下的事情。這是一個歐幾里德算法。
1.爲什麼當我想調用已經在調用堆棧中的函數時它不工作?
2.我如何使它工作?調用已經在調用堆棧中的函數

import sys 
def __block_1__(): 
     __block_2__() 
def __block_2__(): 
     global b,a 
     b,a=None,None 
     __block_3__() 
def __block_3__(): 
     global b,a 
     a=int(raw_input()) 
     __block_4__() 
def __block_4__(): 
     global b,a 
     b=int(raw_input()) 
     __block_5__() 
def __block_5__(): 
     global b,a 
     if a==b: 
       __block_6__() 
     else: 
       __block_7__() 
def __block_6__(): 
     global b,a 
     __block_8__() 
def __block_8__(): 
     global b,a 
     sys.exit(0) 
def __block_7__(): 
     global b,a 
     if a<b: 
       __block_9__() 
     else: 
       __block_10__() 
def __block_9__(): 
     global b,a 
     b=b-a 
     __block_5__ 
def __block_10__(): 
     global b,a 
     a=a-b 
     __block_5__ 
__block_1__() 
+4

在您的塊9和10中,您不會調用'__block_5__',因爲您忘記了括號。你的代碼也難以閱讀。你爲什麼把所有的下劃線都放在這個地方? – BrenBarn 2014-09-19 07:04:33

+0

這是一個自動生成的代碼。對不起,我沒有注意到。謝謝。 – ggt 2014-09-19 07:07:32

回答

2

這是我見過的歐幾里德GCD算法最瘋狂的實現! :)因爲它使用遞歸減法,它不是很有效。 OTOH,我想這很有趣,尤其是因爲它是自動生成的。 (這怎麼自動生成的,順便說一句?)

我通常使用:

def gcd(a, b): 
    if a < b: 
     a, b = b, a 
    while b > 0: 
     a, b = b, a%b 
    return a 

在Python中,我們儘量避免使用全局變量,但我想我們可以原諒你自動生成了罪。請注意,當你想要修改一個全局變量時,你只需要global語句,它不是僅僅需要讀取全局變量。

從通話中缺少括號

除了以block_5是BrenBarn提到的,你的程序沒有任何一種輸出語句的,所以一旦它計算GCD它實際上並沒有用它做任何事情。 :)

另請注意,如果任一參數是< = 0,則遞歸堆棧會爆炸。

無論如何,我決定清理你的代碼&擺脫冗餘塊,在別人可能想跟蹤算法看看它爲什麼工作的機會。

#! /usr/bin/env python 

''' Calculate the gcd of two positive integers 

    Uses a recursive state machine implemetation of the naive form 
    of Euclid's algorithm. 

    From http://stackoverflow.com/questions/25928184/calling-the-functions-which-are-already-in-the-callstack 

    Modified by PM 2Ring 2014.09.19 
''' 

def block3(): 
    global a 
    a = int(raw_input('a: ')) 
    block4() 

def block4(): 
    global b 
    b = int(raw_input('b: ')) 
    block5() 

def block5(): 
    if a == b: 
     block8() 
    else: 
     block7() 

def block7(): 
    if a < b: 
     block9() 
    else: 
     block10() 

def block8(): 
    print a 
    exit() 

def block9(): 
    global b 
    b -= a 
    block5() 

def block10(): 
    global a 
    a -= b 
    block5() 

if __name__ == '__main__': 
    block3() 

我想你會同意我的版本更具可讀性。 :)

+0

我一直在開發一個教育軟件來繪製一個編程流程圖並執行它來查看結果。在軟件中,每個塊代表一個功能。所以它是這樣產生的。你可以在這裏看到我的程序。 https://github.com/ggtulga/blockTest – ggt 2014-09-23 10:04:22

+0

任何建議和意見,歡迎。 – ggt 2014-09-23 10:05:05

相關問題