【问题标题】:Recursive function that filter names (python)过滤名称的递归函数(python)
【发布时间】:2022-11-19 07:44:53
【问题描述】:

我需要定义一个递归函数,它接受两个参数(一个包含名称和一个初始值的列表),并返回一个包含所有以初始值开头的名称的新列表。

现在我得到了这段代码,但我不知道为什么它不起作用:

def filter_names(names, initial):
    result = []
    if names[0][0] == initial:
        result.append(names[0])
    else:
        filter_names(names[1:], initial)
    return result

【问题讨论】:

  • 我觉得你可能应该做 result.extend(filter_names(names[1:], initial)) 而不是你在该行上的内容(在 else: 之后),但你应该提供示例输入和预期输出,以便我们可以运行和测试它。
  • 每个递归调用都有自己的 result 列表,并且您永远不会将来自一个递归调用的 result 发送回父级。要么通过将其作为参数传递之类的操作让它们共享同一个列表,要么使用返回的列表。
  • 这是递归的一个糟糕例子。您是否在在线教程中阅读过此内容?另请注意,您的递归一旦遇到带有该首字母的 FIRST 名称就会停止。你不能使用else:;您每次都需要递归,除非列表为空。
  • 仔细想想其中的逻辑。当递归调用发生时,它是否能够附加到与父级相同的result列表?不;它将创建它的自己的,完全独立的result,就像如果你打电话任何其他功能而不是使用递归。

标签: python function recursion


【解决方案1】:

您的递归调用没有附加到外部作用域中定义的同一个 result

通常在递归函数中,您将递归调用的结果与您在当前框架中所做的任何工作结合起来。在这种情况下,它可能看起来像这样:

def filter_names(names, initial):
    if not names:
        return []
    return (
        [names[0]] if names[0][0] == initial else []
    ) + filter_names([1:], initial)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2015-02-12
    • 2018-04-10
    • 2022-06-20
    • 2012-11-22
    相关资源
    最近更新 更多