递归 - 为什么这段打印数字序列的代码不起作用

Recursion - why this code to print a sequence of numbers does not work

我很抱歉在这里提出这样一个琐碎的初学者问题,但每次我在理解递归方面向前迈进两步,我似乎都在倒退三步。我不明白为什么这个将 n 个数字存储在数组中的简单代码会给出空白。我可以通过注释部分让它工作,但在顶部不起作用,我假设当堆栈框架展开时 y 和 x 将被填充并且数组应该 return 一个数字列表。有人可以解释一下我的假设有什么问题吗?如何可视化递归以及如何在递归调用时以及 return 值传播回主函数时如何使用结果?

def nums(n,x):

    if n == 0:
        return n
    else:
         y=(nums(n-1,x))
         x.append(y)    
    return x                # output was all blanks

      #  nums(n-1,x)
      #  x.append(n)
    return x                  # This works

x=[]       
print(nums(7,x))

我们通常用递归来教授这个的方法是用不同的值做堆栈跟踪来演示流程。

nums(0, []) => 0 # n.b., this is a scalar, not an array based on the code above
nums(1, []) =>
  y = (nums(0, x)) => 0 (from above) # n.b., this might be interpreted as a tuple since we have surrounded it with parentheses, best to avoid enclosing parentheses if you don't need them
  x.append(y) => x = [ 0 ]
  return x => [ 0 ]

现在我们变得棘手了,因为 x 是一个 list,所以它 通过引用 传递并返回。所以对于 n > 1,我们将把 x 附加到它本身,这就是导致问题的原因

nums(2, []) =>
  y = nums(1, []) =>
    y = nums(0, []) =>
      y = 0
      x = [ 0 ]
    => [ 0 ]
  x.append(x = [ 0 ]) => yields a circular reference since we are appending x to itself

您可能打算使用堆栈展开语义,但如果那是我们在进行递归时需要新列表作为局部变量的意图:


def nums(n):
    if n == 0:
        return [ 0 ]
    return [ n ] + nums(n - 1)