【问题标题】:how the return is working in recursion with reference to the following code参考以下代码,返回如何以递归方式工作
【发布时间】:2019-03-12 15:26:12
【问题描述】:
def subs(l):
    if l == []:
        return [[]]

    x = subs(l[1:])

    return x + [[l[0]] + y for y in x]

1) 我正在尝试理解上述代码的工作原理

2)如果l = [1,2,3]在递归结束我们将得到一个空列表列表

3) 在最后的下一次迭代中,我们将得到 x 的结果将是 3 (我想它会进入下一步return

4) 在这些returns 中,我想它会添加return x + [[l[0]] + y for y in x] 应该返回(3,3)

5) 完成这些步骤后,答案应该是(3,3)

根据第二步的最终答案必须是[[],[3,3]]

但代码打印出不同的答案。

o/p 

[], [3]]

谁能解释我的假设哪里出了问题以及return x + [[l[0]] + y for y in x]这些步骤是如何工作的?

【问题讨论】:

  • 无法复制。您的代码对我来说非常有效......(假设它应该返回子列表列表)。
  • 我认为您在计算 x 的值时出错了。当l=[3],然后x=[[]]。在第 4 步中,return x + [[l[0]] + y for y in x] 的结果将是 [[]] + [[3] + []],即 [[], [3]]
  • 代码工作正常,但我无法理解如何?根据我的假设,o/p 应该不同,我无法弄清楚上述代码中的返回值

标签: python recursion


【解决方案1】:

我对代码做了一些修改,让它打印中间结果:

def subs(l, num=0):

    print(' ' * num, 'current l is:', l)
    print()

    if l == []:
        return [[]]

    x = subs(l[1:], num + 4)
    print(' ' * num, 'current x is:', x)

    answer = x + [[l[0]] + y for y in x]
    print(' ' * num, 'current answer is:', answer)

    print()

    return answer

subs([1, 2, 3])

让我们看看输出(这是一张图片):

缩进描述了递归深度。黑色箭头显示计算流程。红色箭头表示 lx 彼此对应(属于同一个命名空间)。从图中可以看出递归与循环有何不同。递归一直到平凡的情况,然后上升。注意红色箭头。

所以,首先,x 永远不是3。实际上不可能。其次,l 可以是[3]。对应的x 是最后递归步骤返回的[[]](平凡的情况)。这些值给你答案[[], [3]]。这是之前的l = [2, 3]x

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 2013-01-25
    • 2018-05-24
    • 1970-01-01
    • 2020-11-07
    • 2018-04-09
    • 2017-07-06
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多