【问题标题】:List append in recursion列表追加递归
【发布时间】:2017-12-15 12:16:04
【问题描述】:

我无法制作帕斯卡三角形。我需要以递归方式追加到列表元素,但我的工作结果是列表追加到列表中。你能帮我做吗? 我的测试代码是:

def list(row):
    if(row is 0):
        return 0
    return [row, list(row-1)]

如果我使用它,我会在列表中返回列表。我需要列表中的元素

print(list(10))

输出:

[10, [9, [8, [7, [6, [5, [4, [3, [2, [1, 0]]]]]]]]]]

预期输出:

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

【问题讨论】:

  • 应该使用递归。
  • list 是python中的保留字,请为您的函数使用不同的名称
  • 您能否提供输入和预期输出?
  • 它不会改变任何东西。
  • @Szabolcs 是的,我已经编辑过了

标签: python list recursion append


【解决方案1】:

听起来您想将列表[x] 与调用list(x-1) 后返回的列表连接起来。 python 中列表的好处在于+ 运算符正是这样做的。如果我们将最终的 return 语句更改为 return [x] + list(x-1),我们就朝着正确的方向前进。然后您会注意到当 x 为 0 时会遇到麻烦,因为您无法将列表添加到整数,因此您需要将基本情况更改为 return [0]。最后,如前所述,最好避免声明覆盖 python 内置函数的名称(list 是其中之一),所以让我们将您的函数重命名为 my_list

def my_list(row):
    if row == 0:
        return [0]
    return [row] + my_list(row-1)

这并不能完全让您进入帕斯卡三角形,但希望您走在正确的道路上。

【讨论】:

  • 谢谢。这个答案也很有帮助
【解决方案2】:

你想要的大概是这样的:

return [row] + list(row-1)

这将创建一个包含一个元素 row 的列表,并在其上添加另一个列表。

【讨论】:

    【解决方案3】:

    关于您的特定功能,这是您可以编写的一种方式

    def foo (row):
      if row == 0:
        return [0]
      else:
        return [row] + foo (row - 1)
    
    print(foo(10))
    # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    

    也许是一种更“pythonic”的写作方式

    print([10 - x for x in range (0, 11)])
    # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    

    关于帕斯卡三角形,这里有一种使用辅助助手和延续传递风格编写程序的方法——对于那些想知道的人来说,做出这个选择是为了让结果可以以一种直接的方式组装 递归调用在尾部位置,这意味着这个函数可以很容易地放在蹦床上,以便在必要时实现堆栈安全

    def sliding (n,xs):
      if n > len(xs):
        return []
      else:
        return [xs[0:n]] + sliding(n, xs[1:])
    
    def pascal (n):
      def aux (m, prev, k):
        if n == m:
          return k([prev])
        else:
          return aux(m + 1, [1] + [x + y for (x,y) in sliding(2, prev)] + [1], lambda rest: k([prev] + rest))
      return aux(1, [1], lambda x: x)
    
    for line in pascal(5):
      print(line)
    # [1]
    # [1, 1]
    # [1, 2, 1]
    # [1, 3, 3, 1]
    # [1, 4, 6, 4, 1]
    

    【讨论】:

      【解决方案4】:

      您可以创建一个递归范围函数来输出您的预期结果:

      def rec_range(n):
          return [n] + rec_range(n-1) if n else [0]
      >>> rec_range(10)
      [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      

      希望对你有帮助。

      或者只使用range(python2.x 中的xrange):

      >>> list(range(10+1))[::-1]  # reverse the list
      [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      

      【讨论】:

      • 非常感谢。很有帮助
      【解决方案5】:

      您可以使用给定的方式创建帕斯卡三角形

      def pascal(rows):
          for i in range (rows):
          value=1
          List = [value]
          for j in range (i):
              value = value * ( i-j ) * 1 / ( j + 1 )
              List.append(int(value))
          print(List)
      
      pascal(5)
      # [1]
      # [1, 1]
      # [1, 2, 1]
      # [1, 3, 3, 1]
      # [1, 4, 6, 4, 1]
      

      【讨论】:

      • 应该使用递归。这是一项任务。
      猜你喜欢
      • 2012-04-10
      • 2020-05-05
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多