2014-11-24 34 views
0
def new_if (pred,then_clause,else_clause): 

    if pred: 
     then_clause 
    else: 
     else_clause 

def p(x): 
    new_if(x>5,print(x),p(2*x)) 

p(1) 

我認爲函數應該停止,一旦x達到8和8打印出來。Python,爲什麼這個函數進入死循環

非常感謝幫助

+0

'x> 5' ...你想通過什麼? – rnevius 2014-11-24 15:24:42

+0

爲什麼你在參數中傳遞打印函數? – 2014-11-24 15:24:52

+0

因爲我使用蟒蛇導師,我發現1,2,4,8和以下打印out..infinite循環.. – 2014-11-24 15:25:34

回答

2

您的代碼不會做你認爲它。

每當您撥打p它會執行該方法中的代碼,在您的情況下,該代碼將使用一些參數調用new_if。但是,您立即評估這些參數,這意味着在輸入new_if之前,您的代碼正在執行print(x)p(2*x)。這導致p再次被調用,重複該過程。

+0

瞭解,感謝幫助的人! – 2014-11-24 15:31:26

2

在你如何評估代碼的過程中似乎存在一些普遍的混淆:特別是,你認爲謂詞和子句真的不是。在之前評估參數,調用new_if。因此,您可以通過p進行無限遞歸調用,幾乎在您撥打p後立即評估p(2*x)

您可以通過傳遞函數來實現您想要的功能,然後您可以在您的new_if函數中進行評估。這可以用lambda函數來完成,像這樣:

def new_if (pred,then_clause,else_clause): 
    if pred(): 
     then_clause() 
    else: 
     else_clause() 

def p(x): 
    new_if(lambda: x>5, lambda: print(x), lambda: p(2*x)) 

p(1) 

在這種情況下,predthen_clauseelse_clause都是你需要調用(())爲他們執行可調用。