【问题标题】:Return in recursion递归返回
【发布时间】:2022-01-03 07:03:36
【问题描述】:

是否可以在递归函数调用中的'return'语句下使用'if'语句?如果没有,还有什么其他技术/方法可以弥补它? 例如:

def is_palindrome(s, count=0):

   if count == int(len(s)/2):
       return True

   return is_palindrome(s,count+1) if s[count] == s[len(s)-(count+1)]

res = is_palindrome("rever")
print(res)

【问题讨论】:

  • 旁注:您应该使用if count == len(s) // 2:,而不是if count == int(len(s)/2):。前者直接执行仅整数下限除法,后者执行浮点除法,然后使用int 构造函数截断小数部分(速度较慢,并且对于除 2 的幂以外的除数或足够大的整数,可能不准确)。
  • 看到这个related Q&A

标签: python if-statement recursion return


【解决方案1】:

你可以使用conditional expressionA if COND else B;当CONDTrue 时,此值为A,否则为B

def is_palindrome(s, count=0):
    if count == len(s) // 2:
        return True
    return is_palindrome(s, count + 1) if s[count] == s[-(count + 1)] else False

print(is_palindrome('rever')) # True
print(is_palindrome('never')) # False

在这种情况下,使用and 更简单:

def is_palindrome(s, count=0):
    if count == len(s) // 2:
        return True
    return s[count] == s[-(count + 1)] and is_palindrome(s, count + 1)

如果您担心会为is_palindrome 打不必要的电话,那不是真的; and短路,这意味着只有当s[count] == s[-(count + 1)]True 时才会评估is_palindrome(...)

【讨论】:

  • 可能,但return s[count] == s[-(count+1)] and is_palindrome(s, count+1) 会更清楚。
  • @chepner 是的,这是我的第一个答案版本,但我对其进行了编辑,因为 OP 似乎想要 if 某处。也许最好也提供它。
  • @chepner ...我做到了!感谢您的建议。
猜你喜欢
  • 2014-12-25
  • 2022-01-16
  • 2021-03-14
  • 2015-12-22
  • 2014-01-18
  • 2017-10-27
  • 2019-09-12
  • 2014-06-04
相关资源
最近更新 更多