【发布时间】:2021-12-01 23:04:00
【问题描述】:
这张图片中写的函数是用来解释递归的。它说该函数需要 T(n) 时间来运行,但它包含一个递归调用,然后它需要 T(n-1) 时间来运行。但是我们知道函数需要 T(n) 时间并且需要相同的函数调用然后它应该再次需要 T(n) 时间,因为函数正在做与以前相同的事情。如果我对概念的理解有误,或者代码中的概念解释有误,请告诉我。
【问题讨论】:
-
第一次用
n>0调用Test(n),它调用printf()。这样就完成了第一步,所以自然还剩下n-1步骤。这是通过调用Test(n-1)来完成的。一般来说,理解递归函数的一个好方法是从n=0开始,手动单步执行函数,看看会发生什么。然后执行n=1、n=2等,直到你对正在发生的事情建立起直觉。 -
实际上这里的总函数执行将花费 T(n) 时间,只有一次函数调用迭代需要一个常数时间,或者说 T(1)。由于该函数将逐步调用自身 n 次,因此总时间将为 T(n)。
-
@Tamim 但请注意,
printf("%d", n)实际上需要 O(log n) 时间,因为要打印 log10(n) 个数字。 :-) -
请将代码和数据添加为文本 (using code formatting),而不是图像。图片:A)不允许我们复制粘贴代码/错误/数据进行测试; B) 不允许根据代码/错误/数据内容进行搜索;和many more reasons。除了代码格式的文本之外,只有在图像添加了一些重要的东西,而不仅仅是文本代码/错误/数据传达的内容时,才应该使用图像。
标签: c++ algorithm recursion logic big-o