【问题标题】:sorting numbers using recursion使用递归对数字进行排序
【发布时间】:2013-08-07 19:43:37
【问题描述】:

使用递归而不是使用for i in range(11): 的目的是因为它有利于从顶部开始尝试解决特定的数学问题。该函数将被更改,使其仅返回符合特定条件的[n]

print(numbers)=[[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]]为什么会有多余的括号? print(numbers[7])=IndexError: list index out of range 这跟多余的括号有关系吗?

# A function that is supposed to help sorting numbers in a list
def sorting_numbers(n):
    if n > 1:
        return [n] + sorting_numbers(n-1)
    else:
        return [1]

numbers = []
n = 10
numbers = (sorting_numbers(n))
print(numbers)

print(numbers)=[[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]]为什么会有多余的括号? print(numbers[7])=IndexError: list index out of range 这跟多余的括号有关系吗?

【问题讨论】:

  • “因此它只返回符合特定条件的 [n]”对此使用列表推导。对这个问题使用递归确实没有任何优势。
  • 如果您还有其他问题,请将它们作为单独的问题发布。您每次都不断删除/取消删除/编辑和更改问题的范围,这不是 SO 的工作方式。关于最后一个问题:请参阅answer 以了解如何增加递归限制 - 但 真的 这不是解决方案,解决方案是避免使用递归
  • 阅读答案了吗?正确使用sorting_numbers的方法是:numbers = storing_numbers(10),不要使用append
  • 好的,我下次不会更改问题。对不起。我将发布新问题。感谢您的时间。这对我帮助很大。我确实阅读并尝试了它。我错过了删除附加。我的错。

标签: python list recursion python-3.x


【解决方案1】:

如果您真的想对这样一个简单的问题使用递归 - 请注意它的效率非常低,并且对于接近 n 的值会导致 maximum recursion depth exceeded 错误 1000 (Python 的设计目的不是有效地处理递归):

def storing_numbers(n):
    if n > 1:
        return [n] + storing_numbers(n-1)
    else:
        return [1]

或者更短一点:

def storing_numbers(n):
    return [] if n <= 0 else [n] + storing_numbers(n-1)

注意我们是如何构建列表的,并且基本情况也返回一个列表。像这样使用它:

numbers = storing_numbers(10)
numbers
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

当然,使用递归函数为学术练习之外的任何事情建立一个列表是不现实的。现实生活中的实际实现会这样做:

list(range(10, 0, -1))
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

下面是您如何使用列表推导来过滤符合特定条件的数字,比如说,只有偶数:

[x for x in range(10, 0, -1) if x % 2 == 0]
=> [10, 8, 6, 4, 2]

【讨论】:

    【解决方案2】:

    每当您进行递归调用时,都会返回一个元组:(number, recursive_result)。因此,每次递归时,都会在最终结果中嵌入另一层元组。

    看起来您的意图只是将 1 中的数字与输入数字相加,因此您所要做的就是更改第 3 行以返回递归调用的结果 plus 原始数字,而不是直接返回它们。

    def function(number):
        if number > 1:
            # return the recursive result added to the original number
            return number + function(number-1) 
        else:
            return number
    

    作为旁注,你应该给你的函数一个更具描述性的名字,这样它的目的就很清楚了!

    【讨论】:

      最近更新 更多