追踪递归函数

问题描述 投票:0回答:1

我有下面列出的家庭作业

Lee 发现了他认为聪明的递归策略 打印序列(字符串、元组或列表)中的元素。他 他可以使用 0 获取序列中的第一个元素的原因 索引,他可以通过以下方式获得其余元素的序列 从索引 1 进行切片。该策略通过以下函数实现: 只期望序列作为参数。如果顺序不是 空,打印序列中的第一个元素,然后打印 执行递归调用。在每次递归调用时,序列 使用范围 1: 对参数进行切片。这是Lee的函数 定义:

以及我到目前为止的代码,但它实际上只是使函数打印我测试的内容:

def printAll(seq):
    if seq:
        print(seq[0])
        printAll(seq[1:])


test_string = "Run it up plenty"
test_tuple = ("tony", "boney", "phoney")
test_list = ["yuji", "megumi","nobara"]
printAll(test_list)

作业想要:

编写一个程序来测试该函数并添加代码来跟踪 每次调用的参数。该功能是否按预期工作?如果是的话,是 运行它有任何隐性成本吗?

我不喜欢从作业中直接提出问题,但我根本不明白如何让函数被跟踪以进行作业。我什至不知道从哪里开始。

python function recursion trace
1个回答
0
投票

如果您想跟踪序列的值(就像您已经做的那样)和递归深度,那么使用缩进确实很好(正如您在评论中建议的那样)。

您可以将当前缩进作为第二个参数传递,该参数在进行顶级调用时有一个默认值:

def printAll(seq, indent=""): if seq: print(f"{indent}{seq[0]}") # print the value with indentation printAll(seq[1:], indent + ". ") # extend the indentation
对于您的示例调用,输出:

yuji . megumi . . nobara
这说明内存(更具体地说,堆栈空间)方面存在成本。对于 3 个项目的序列,这是可以忽略不计的,但如果您的序列有 10,000 个元素,则您的递归深度也会达到 10,000,并且您的 Python 配置可能不允许使用如此多的堆栈空间。

注意:我使用了 f 字符串语法,这是执行以下操作的更好方法:

print(indent + str(seq[0]))
    
© www.soinside.com 2019 - 2024. All rights reserved.