【问题标题】:Recursion and Tuples in Python [duplicate]Python中的递归和元组[重复]
【发布时间】:2015-03-26 01:44:04
【问题描述】:

我正在尝试编写两个接受整数并返回元组的函数。我可以非常接近想要返回的内容,但我返回的内容中有多个括号。例如,我希望 rec_range(5) 返回 (0,1,2,3,4) 而不是 (((((0, 1), 2), 3), 4)。

这是我写的两个函数

def rec_range(n):
    '''Takes a natural number n and returns a tuple of numbers starting
       with 0 and ending before n.
       Int-->Tuple'''

    if n == 0:
         return 
    if n == 1:
        return 0
    if n >= 1:
        return rec_range(n-1),(n-1)

def squares_tuple(n,m):
    '''Takes a natural numbers n and m and returns a tuple of the squares
       of all the natural numbers starting with n and ending with m-1.
       Int,Int-->Tuple'''

    while n<=m:
        return n * n, squares_tuple(n + 1, m)

【问题讨论】:

  • 另外,我不想使用 range()、map()、循环或列表。
  • 是的,但我想知道为什么我得到了我得到的。
  • 这不是递归的好用例

标签: python recursion tuples


【解决方案1】:

这是因为您将递归调用的返回值用作新元组中的单个元素,而不是从返回值中的元素加上新元素构造元组。

相反,您可能应该将元组添加在一起:

return rec_range(n-1) + (n-1,)

return (n*n,) + squares_tuple(n+1, m)

请注意,这样做意味着您的函数需要始终返回一个元组(这可能是一件好事,因为有时返回一种数据类型,有时返回另一种数据类型是创建运行时错误的好方法),因此您需要调整一些你的其他非递归返回 - 相反,而不是return 0,你想使用return (0,)

【讨论】:

    【解决方案2】:

    两个问题:首先,您需要为基本情况返回一个元组,而不是一个 int:

    if n == 1:
        return (0,)
    

    其次,您需要将n - 1 附加到元组,而不是将其与元组成对返回:

    if n >= 1:
        return rec_range(n-1) + (n-1,)
    

    您的squares_tuple 可以通过类似的方法解决。请注意,我更改了基本情况以返回一个空元组而不是 None。 (我还将while 更改为if,这样会更清楚一些,因为它只发生一次)。

    if n<=m:
        return (n * n,) + squares_tuple(n + 1, m)
    return ()
    

    【讨论】:

      猜你喜欢
      • 2017-02-21
      • 2021-12-25
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2016-11-15
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多