我试图了解这段代码的工作方式。这是基本的递归,但是我很难理解这个概念。
该代码来自sololearn应用程序,我已经阅读了有关该主题的教程,但未能理解该概念。每次打印出函数的返回值时,您都会得到一个布尔值,但是我不明白函数如何获得该结果。就像我可以运行代码并查看输出一样,但是我需要知道它如何工作。爱你!
def is_even(x):
if x == 0:
return True
else:
return is_odd(x-1)
def is_odd(x):
return not is_even(x)
print(is_odd(1))
答案 0 :(得分:1)
尝试跟踪执行情况,(=>)的左侧表示对其中一个函数的新调用,右侧表示采取了哪些步骤来确定最终结果。
is_odd(1) => not is_even(1)
is_even(1) => is_odd(0)
is_odd(0) => not (is_even(0))
is_even(0) => True
=> not (True)
=> False
=> False
=> not (False)
=> True
或者这可能会有更多帮助,
is_odd(1)
=> not is_even(1)
=> not (is_odd(0)
=> not (not (is_even(0))
=> not (not (True))
=> not (False)
=> True
FWIW,这些函数称为“相互递归”(即,相互调用的函数超过1个)。如果您对递归不满意,则可能应该从简单的单次递归开始,常见的例子是斐波那契数或阶乘函数。
def fact(n):
if n == 0:
return 1
else:
return n * fact (n-1)
def fib(n):
if n == 0:
return 1
elif n == 1:
return 1
else:
return fib (n-1) + fib (n-2)
答案 1 :(得分:0)
我添加了一些有用的打印语句,希望这有助于了解调用is_odd
时实际执行的操作:
def is_even(x):
if x == 0:
print("return True")
return True
else:
print("return is_odd({0}-1)".format(x))
return is_odd(x-1)
def is_odd(x):
print("return not is_even({0})".format(x))
return not is_even(x)
print(is_odd(1))
return not is_even(1)
return is_odd(1-1)
return not is_even(0)
return True
True
print(is_odd(2))
return not is_even(2)
return is_odd(2-1)
return not is_even(1)
return is_odd(1-1)
return not is_even(0)
return True
False
另外,考虑使用python debugger来交互式检查代码的运行情况。
答案 2 :(得分:0)
因此,让我们按步骤进行分解。
def is_even(x):
if x == 0:
return True
else:
return is_odd(x-1)
def is_odd(x):
return not is_even(x)
print(is_odd(1))
1) we say print -> is_odd(1). So we're sending a 1 to is_odd() function
2) is_odd() recieves the 1 and before it can return a value, it must call is_even() and send that same 1.
3) is_even() now recieves that 1 and checks if its equal to zero, but it fails, so it then has to call is_odd() and send it 1 - 1.
4) is_odd checks the new value (zero in this case) and calls again is_even() sending that zero
5) is_even() now resovles at the if x == 0: line and returns True.
6) Now we've reached the end of the recursive loop and all the functions will resolve with their return statments. Starting with the is_even() being True.
这是细分->
print(is_odd(1)) ->
print(NOT is_even(1))->
print(NOT is_odd(1-1)) ->
print(NOT NOT is_even(0)) ->
print(is_even(0)) ->
print(True) ->
True