递归函数不返回值

时间:2018-11-08 22:20:19

标签: python python-3.x recursion

该代码应用于查找整数的总和。当我运行它时,计算机只处理了一段时间,然后什么也没发生

def sum_of_digits(integer):
    numlist = list(str(integer))
    if len(numlist) == 0:
        result = 0
    elif len(numlist) == 1:
        result = numlist[0]
    else:
        midPoint = len(numlist) // 2
        result = sum_of_digits(numlist[:midPoint]) + 
        sum_of_digits(numlist[midPoint:])
    print(result)
    return result


sum_of_digits(123456)

5 个答案:

答案 0 :(得分:1)

此答案不会将数字转换为字符串(或其他可迭代的数字),然后再转换回数字。

def sum_of_digits (n: int, sum = 0) -> int:
  if n < 10:
    return n + sum
  else:
    return sum_of_digits (n // 10, sum + n % 10)

print(sum_of_digits(1))      # 1
print(sum_of_digits(12))     # 3
print(sum_of_digits(123))    # 6
print(sum_of_digits(1234))   # 10
print(sum_of_digits(12345))  # 15

答案 1 :(得分:1)

另一种无需数据类型转换的简单解决方案:

def sum_of_digits(integer):
    if integer == 0:
        return 0
    else:
        return integer % 10 + sum_of_digits(integer // 10)

答案 2 :(得分:0)

您已经使数据类型非常混乱。命名integer并不会使它成为整数。第一次通话就可以了。完成任何基本调试之后,您就会看到问题所在:将整数转换为单字符字符串列表。

拆分列表并重复使用时,您会将半列表作为integer传递到函数中。当您立即使用str(integer)将其转换为新字符串时,将得到类似于"['1']"的字符串,而不是简单的字符数字。当您将那个分解成一个列表时,您将['[', "'", '1', ']', "'"]称为numlist ... ...从那里是一个讨厌的无限递归。

首先,请确保您的函数具有一致的接口:如果没有其他问题,请将半字符串重新构造为整数并将该值提供给递归调用。其次,不要过于膨胀:您可以简单地将整数转换为字符串并处理各个数字;无需为此列出清单。 第三,请访问这个可爱的debug博客以寻求帮助。

最后,您可以在线研究其他解决方案。这是一个常见的练习。我不是要告诉您复制程序-但是,既然您已对问题进行了很好的尝试,则可以从其他人那里了解内部处理。

为了让您动起来,这是我如何调试代码:print进入和退出时有用的东西,并延迟(睡眠),因此我有机会在有用的信息发布之前中断程序离开屏幕。

from time import sleep

call = 0

def sum_of_digits(integer):
    global call

    call += 1
    id = call 

    print("ENTER", call, integer)

    numlist = list(str(integer))
    print("numlist", numlist)
    sleep(1)

    if len(numlist) == 0: 
        result = 0
    elif len(numlist) == 1:
        result = numlist[0]
    else:
        midPoint = len(numlist) // 2
        result = sum_of_digits(numlist[:midPoint]) + \ 
                 sum_of_digits(numlist[midPoint:])

    print("LEAVE", id, result)
    return result


test = [0, 1, 12]
for case in test:
    call = 0
    sum_of_digits(case)
    print("-------------------------")

输出:

ENTER 1 0
numlist ['0']
LEAVE 1 0
-------------------------
ENTER 1 1
numlist ['1']
LEAVE 1 1
-------------------------
ENTER 1 12
numlist ['1', '2']
ENTER 2 ['1']
numlist ['[', "'", '1', "'", ']']
ENTER 3 ['[', "'"]
numlist ['[', "'", '[', "'", ',', ' ', '"', "'", '"', ']']
ENTER 4 ['[', "'", '[', "'", ',']
numlist ['[', "'", '[', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", '[', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ']']
^CTraceback (most recent call last):
  File "so.py", line 33, in <module>
    sum_of_digits(case)
  File "so.py", line 23, in sum_of_digits
    result = sum_of_digits(numlist[:midPoint]) + \
  File "so.py", line 23, in sum_of_digits
    result = sum_of_digits(numlist[:midPoint]) + \
  File "so.py", line 23, in sum_of_digits
    result = sum_of_digits(numlist[:midPoint]) + \
  File "so.py", line 15, in sum_of_digits
    sleep(1)
KeyboardInterrupt

答案 3 :(得分:0)

您正在内部调用自己的函数。同样,在调用它时,您会给它一个列表而不是整数,从而导致它遍历列表而不是所需的数字。您可能想使用''.join返回一个整数而不是一个列表。

sum_of_digits(int(''.join(numlist[:midPoint]))))

即使执行此操作,您的函数仍需要做更多的工作,并且您可能想使用int()声明来确保使用整数。

另外,您可以使用使用for循环的东西,该循环可以更有效地实现目标,但可能不是您想要的。

def sum_of_digits(integer):
    ans=0
    for i in str(integer):
        ans+=int(i) 
    return ans

答案 4 :(得分:0)

即使“什么也没有发生”并不能提供太多信息,但您显然是在以一种非常混乱的方式混合数据类型。

您的sum_of_digits函数使用一个整数作为参数,调用它integer并不能使它成为一个整数,仍然需要确保使用正确的参数调用它。

当您使用sum_of_digits(numlist[:midPoint])sum_of_digits(numlist[midPoint:])递归调用它时,您传递的不是整数,这是问题所在,请继续进行处理。