【问题标题】:This is explanation on recursion tracing and i can't understand some logic in it. Please help me with the logic这是关于递归跟踪的解释,我无法理解其中的一些逻辑。请帮我解释一下逻辑
【发布时间】: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=1n=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


【解决方案1】:

图片是这个

void Test(int n) {
    if (n > 0) {
        printf("%d",n);        // 1
        Test(n-1);             // T(n-1)
    }
}
// T(n) = T(n-1) + 1

根据定义T(n)Test(n) 花费的时间。此外,T(n-1) 只是“拨打Test(n-1) 所用时间”的标签。

由于函数只调用printf,复杂度不变,算作1条指令,调用Test(n-1),总运行时间为T(n) = T(n-1) + 1

但是我们知道函数需要 T(n) 时间,并且同样的函数调用也需要 T(n) 时间,因为函数做的事情和以前一样。

不,T(n-1)T(n) 不同,因为 Test(n)Test(n-1) 不同。 Test(n) 的作用与 Test(n-1) 相同,只是调用了一次 printf

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多