Python:递归返回无值

时间:2017-05-19 04:02:19

标签: python python-2.7 recursion

我正在尝试编写一个找到满意数字的程序: more info here. 这不是学校作业,但我只是想练习我的Python 2.7。 基本上,递归是这一点的重要组成部分,因为我必须保持每个数字的平方。 在我的代码中,我使用递归来继续运行它,我有一个基本情况,它可以工作,但由于某种原因,即使我调用该函数,也不会发生递归。 它只返回第一个数字的数字方块,这是一个错误测试,它返回None,然后它停止运行。 有什么问题?

num = raw_input('Pick a positive integer that you want to check for a happy number')
def happyn(number,second,third,fourth):
  if len(number) == 2:
    go = int(number[0])**2 + int(number[1])**2
  elif len(number) == 3:
    go = int(number[0])**2 + int(number[1])**2 + int(number[2])**2
  elif len(number) == 4:
    go = int(number[0])**2 + int(number[1])**2 + int(number[2])**2 +    int(number[2]**2)

  if len(number) == 1 and int(number) == 1 or int(number) == 7:
    return True
  elif len(number) == 1:
    return False
  else:
    print go
    go = str(go)
    go1 = go[0]
    print go1
    if len(go) == 1:
      go1 = go[0]
      happyn(go1,0,0,0)
    elif len(go) == 2:
      go1 = go[0]
      go2 = go[1]
      happyn(go1,go2,0,0)
    elif len(go) == 3:
      go1 = go[0]
      go2 = go[1]
      go3 = go[2]
      happyn(go1,go2,go3,0)
    elif len(go) == 4:
      go1 = go[0]
      go2 = go[1]
      go3 = go[2]
      go4 = go[4]
      happyn(go1,go2,go3,go4)


print happyn(num,0,0,0)

2 个答案:

答案 0 :(得分:4)

所有可能的执行分支必须返回,否则递归将不起作用。例如,这是错误的:

happyn(go1,0,0,0)

如果没有显式返回任何内容,该函数将返回None。因此,正确的方法是:

return happyn(go1,0,0,0)

您的功能中的所有其他退出点也是如此。

答案 1 :(得分:0)

  1. 您没有返回递归调用的结果,即return happyn(go1, 0, 0, 0)。在Python中,任何以return语句结尾的函数都会隐式返回None

  2. 这不是一个使用递归的好地方;一个简单的while循环更适合。

    def sum_sq(i):
        total = 0
        while i:
            total += (i % 10) ** 2
            i //= 10
        return total
    
    def is_happy(i):
        while i >= 10:
            i = sum_sq(i)
        return i in (1, 7)
    
    def main():
        i = int(raw_input("Please enter a positive integer: "))
        if is_happy(i):
            print("{} is a happy number.".format(i))
        else:
            print("{} is an unhappy number.".format(i))
    
    if __name__=="__main__":
        main()