我从昨天起就开始工作以使这个功能正常工作,但事实并非如此。我已经尝试了一切。我正在使用具有深度递归的函数。 我得到的输出很奇怪:
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,这条线甚至不显示。为什么这只是继续前进?
如果您想知道,节点的构造函数不会再次调用构建器。构造函数不会调用任何外部函数,所以现在来自那里。
答案 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