2014-11-24 31 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都是你需要调用(())为他们执行可调用。