在Python中使用递归的偶数和奇数

时间:2018-03-28 15:40:34

标签: python python-3.x recursion

我试图通过递归来解决“is_even”和“is_odd”函数的问题。我不明白这个函数如何编写永远评估为False,或者任何不是0的函数评估为True。我在teamtreehouse.com工作区中仔细检查了它,以确保它可以正常工作,但我无法弄清楚它是如何工作的。

我知道它通过递归递减,但我不明白is_odd(x)是如何工作的。如果is_odd(x)只是否定了is_even中的所有内容,为什么所有数字都不能评估为True?还是错?

def is_even(x):
    if x == 0:
        return True

    else:
        return is_odd(x-1)

def is_odd(x):
    return not is_even(x)
    # Does this negate the function of is_even(x)?
    # Does that negating mean returning False, or sending to else block?
    # If the negating does automatically sends to the else block
    # After we get here, do we ever land at True in is_even(x)?
    # If not, how do we ever land at False?

print(is_even(1))
print(is_even(2))
print(is_even(3))

2 个答案:

答案 0 :(得分:2)

x = 0
 is_even: True

x = 1
 is_even:
   is_odd(0):
     is_even(0): True
   not True: False
 False

x = 2
 is_even:
   is_odd(1):
     is_even(1): False
   not False: True
 True

x = 3
  is_even:
    is_odd(2):
      is_even(2): True
    not True: False
  False

答案 1 :(得分:0)

让我们举一个函数is_even(1)的例子。会发生什么?

(1)

  1. 输入is_even(1)
  2. 输入is_odd(1-1),即输入is_odd(0)
  3. 不是is_even(0)。输入is_even(0)
  4. x == 0 - >这将返回True
  5. 你有没有,记得在第3步?所以:不是真的 - >假
  6. is_even(1)= False
  7. 现在让我们举一个is_even(2)的例子。会发生什么?

    (2)

    1. 输入is_even(2)
    2. 输入is_odd(2-1),即输入is_odd(1)
    3. 不是is_even(1)
    4. 我们从(1)知道is_even(1)是False,所以不是False = True
    5. 现在使用is_even(3)

      (3)

      1. 输入is_even(3)
      2. 输入is_odd(3-1),即输入is_odd(2)
      3. 不是is_even(2)
      4. 我们从(2)知道is_even(2)是真的,所以不是True = False
      5. 再次提出问题:

        • 这是否否定了is_even(x)的功能?

        是:不是is_even(x)否定了is_even(x)的结果,正如您在我的示例中看到的那样。

        • 这种否定意味着返回False,还是发送给else阻止?

        没有。如果函数is_even(x)返回True,则不返回False。 如果函数is_even(x)返回False,则False不返回True。所以它否定了is_even(x)

        的结果
        • 在我们到达这里之后,我们是否曾在is_even(x)中登陆True?

        由于你总是用(x-1)减少参数,你总是会得到x = 0,正如你在我的例子中看到的那样。