【发布时间】:2014-10-25 17:30:49
【问题描述】:
Codility 的一项任务是找出二叉树的高度。该任务保证高度不会超过 500。所以想到的最简单的解决方案就是使用递归。
现在,虽然这样的解决方案通过了 Codility 中的所有测试,但我想知道我是否可以安全地假设 500 并不过分(对于任何计算机/测试平台可能是 Codility 的测试平台)或我是否应该避免递归并模拟它或以其他方式找到树的高度?
编辑: 正如 PM 77-1 所指出的,答案可能取决于我的递归是什么样子。所以我把它包括在内。定义了一个struct:
struct tree {
int x;
tree * l;
tree * r;
};
这是我的解决方案:
int getHeight(tree const * T, int height)
{
int maxHeight = height;
if (T->l)
{
maxHeight = getHeight(T->l, height + 1);
}
if (T->r)
{
maxHeight = max(maxHeight, getHeight(T->r, height + 1));
}
return maxHeight;
}
int solution(tree * T)
{
return getHeight(T, 0);
}
现在我的问题是 - 知道我的解决方案是什么样子(它可以使用多少内存/等等...)并且不知道测试平台规格是什么,我可以安全地假设 500 次递归调用不会导致堆栈溢出与否?(因为如果它是 50 或 5,我想我可以放心地假设无论测试平台如何。)
编辑:我故意没有指定语言,因为 Codility 支持多种语言,如果可能的话,我想得到一个关于多个的答案。但是,我在我的解决方案中使用了 C++,所以我想这是我最感兴趣的语言。
【问题讨论】:
-
你的问题太笼统了。并非所有的递归都是平等的。例如,如果您的递归在每次调用时都创建了一个非常大的对象,那么您可能会比
stack overflow更早地得到out of memory。 -
没有人可以说它对于任何计算机/测试平台来说都不算太多。对于非常旧的计算机或嵌入式系统来说可能太多了,但任何现代平台都应该毫无问题地处理它 - 另请阅读:stackoverflow.com/questions/1006867/…
-
简短的回答是NO,你不能做出这样的假设。 任何平台都是一个巨大的要求。想想智能咖啡机上内存最少的嵌入式 Java。
-
当然,你是对的,“任何平台”都太宽泛了。但我想到的是“任何可能成为 Codility 测试平台的平台”。