Python递归尝试不返回任何值

时间:2016-10-29 19:53:32

标签: python recursion

我想知道为什么它没有返回任何东西 - 我希望它能归还总和。我对递归很新,我做错了吗?

def inc(sum,vec):
    if vec==[]:
        print "returning sum",sum
        return sum
    else:
       sum= sum+vec.pop(0)
       inc(sum,vec)

In [78]: s=inc(0,[6,7])
returning sum 13

In [79]: s

2 个答案:

答案 0 :(得分:1)

else块应该有return inc(sum,vec)

为什么呢?看看这个:

  • inc(0, [6, 7])致电
    • in else - >致电inc(6, [7])
      • in else - >致电inc(13, [])
        • in if vec == [] - >将13返回给以前的来电者
      • 现在inc(13, []) == 13 并且全部是,此值不会在任何地方传递
    • inc(6, [7])不会返回任何内容
  • inc(0, [6, 7])不会返回任何内容

BTW,if vec == []可以安全地替换为if not vecsum = sum + vec.pop(0) - sum += vec.pop(0)以更加清晰(虽然这条线可能完全省略,见下文)。< / p>

总而言之,代码可能如下所示:

def inc(sum, vec):
    if not vec:
        return sum
    return inc(sum + vec.pop(0), vec)

更重要的是,您可以使用sum参数的默认值:

def inc(vec, sum = 0): # << right here
    if not vec:
        return sum
    return inc(vec, sum + vec.pop(0)) # change the argument position

通过它,对此功能的调用将更加清晰:

inc(0, [6, 7]) # before
inc([6, 7])    # after

如果你想要一个单行(虽然可能不那么可读):

def inc(vec, sum = 0):
    # return sum if vec is empty or the _result_ of a recursive call otherwise
    return sum if not vec else inc(vec, sum + vec.pop(0))

答案 1 :(得分:1)

Python没有隐式返回。许多人似乎认为没有隐式返回的语言在使用递归时会有隐式返回。这不是真的。避免这种常见的陷阱并修复你的代码

def inc(sum,vec):
    if vec==[]:
        print "returning sum",sum
        return sum
    else:
       sum = sum+vec.pop(0)
       return inc(sum,vec)