在函数中无限递归的麻烦

时间:2011-03-17 21:59:58

标签: c++

我从昨天起就开始工作以使这个功能正常工作,但事实并非如此。我已经尝试了一切。我正在使用具有深度递归的函数。 我得到的输出很奇怪:

Im going in with depth: 8
Depth in builder: 8
Depth in builder: 7
Depth in builder: 6
Depth in builder: 5
Depth in builder: 4
Depth in builder: 3
Depth in builder: 2
Depth in builder: 1
Depth in builder: 0
Depth in builder: 0
Depth in builder: 0
Depth in builder: 0
Depth in builder: 1
Depth in builder: 0
Depth in builder: 0
Depth in builder: 0
Depth in builder: 0
Depth in builder: 1

.....

然后它永远地在那些1和0之间交替。这怎么可能?如果深度为0,这条线甚至不显示。为什么这只是继续前进?

如果您想知道,节点的构造函数不会再次调用构建器。构造函数不会调用任何外部函数,所以现在来自那里。

5 个答案:

答案 0 :(得分:6)

我不确定它是否会永远显示它们;它可能会持续一段时间。

你的递归函数在每个级别进行四次递归调用,从深度8到深度为0.这意味着底部总共有4个 8 = 65536个递归调用,4 7 = 16384个深度为1的调用,如果每个调用打印出一行文本并进行内存分配,如果它继续进行,它不会让我感到惊讶很长时间。此外,由于您按照BMP的值进行操作,因此您在每次迭代时都会复制图像(除非它在内部执行某些操作),这会使整个过程进一步减慢。

至于为什么你会看到1 0 0 0 1 0 0 0,我认为这是因为每次你在深度d扩展一个节点时,你会在你恢复到d - 1之前完全展开它的所有孩子。这意味着当你第一次尝试扩展深度为2的节点时,你将在第1级展开四个节点,每个节点打印出1 0 0 0,然后你将在深度2扩展该节点继续深入2的兄弟姐妹,然后再打印出1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0。

简而言之,我不确定这是否是代码中的错误或只是大量的递归调用。

答案 1 :(得分:2)

它不是无限递归,但它会在初始深度为8时执行87381次。

尝试将其简化为递归部分,以便您可以看到正在发生的事情:

//
// builder.cpp
//

#include <iostream>

using namespace std;

void builder(int depth) {

    cout << "Depth in builder: " << depth << endl;

    if (depth <= 0) {
        return;
    }
    if (depth > 0) {
        builder(depth - 1);
        builder(depth - 1);
        builder(depth - 1);
        builder(depth - 1);
    }
}

int main(void)
{
    builder(8);
    return 0;
}


$  g++ -Wall builder.cpp -o builder
$  ./builder | wc -l
   87381

答案 2 :(得分:1)

如果以最简单的形式查看代码(实际上没有做任何事情,仅用于跟踪):

void f(int depth)
{
   // print depth
   cout << depth << endl;
   if(depth <= 0)
      return
   else
   {
      // **FOUR** more calls to the recursive function.
      f(depth - 1);
      f(depth - 1);
      f(depth - 1);
      f(depth - 1);
   }
}

现在考虑在深度1处追踪,您的输出为1 - 0 - 0 - 0,因为每次调用f(1)都会生成四次f(0)调用。现在想想f(2)的输出 - 你会得到2 - <output of f(1) four times>。此模式可以扩展,因此您的预期输出

Output(f(n)) =
                    n
                    Output( f(n-1) )
                    Output( f(n-1) )
                    Output( f(n-1) )

答案 3 :(得分:0)

这类似于预订遍历。在根节点打印深度,然后递归调用其子节点(此处为4.)。鉴于深度为8且分支因子为4级,我们有4 ^ 1个节点。在2级,我们有深度为8的4 ^ 2,底部有4 ^ 8个节点。因此你可以期待看到4 ^ 8 0被打印,4 ^ 7 1被打印等....它不会是无限的。我认为你应该尝试使用3或4的小深度,你会看到它终止。我认为没有理由说它是无限递归。

答案 4 :(得分:0)

对我来说似乎很好。它实际上并不是无限的。 进一步查看你的输出,最终你会看到像210000,310000等的东西。你在每次传递中调用该函数4次,深度&gt; 0