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,该函数应该停止。
非常感谢您的帮助
答案 0 :(得分:2)
您的代码没有按照您的想法执行。
每次调用p
时,它都会执行该方法中的代码,在这种情况下,您可以使用一些参数调用new_if
。但是,您正在立即评估这些参数,这意味着在输入new_if
之前,您的代码正在执行print(x)
和p(2*x)
。这会导致p
再次被调用,重复该过程。
答案 1 :(得分:2)
您认为代码的评估方式似乎存在一些普遍的混淆:特别是您认为谓词和子句实际上并非如此。在调用new_if
之前,会对进行评估。因此,只要您致电p
,就会通过评估p(2*x)
来获得对p
的无限递归调用。
您可以通过传递函数来实现您想要的功能,然后在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)
在这种情况下,pred
,then_clause
,else_clause
是您需要调用(()
)才能执行的callables。