如果给出编程问题中的上述条件并且我使用递归解决它,那么我是否违反了约束条件?这可能是因为递归也使用堆栈?是不是?
答案 0 :(得分:27)
如果堆栈的深度(递归)是恒定的并且相对于输入的大小没有变化,那么递归解可以是O(1)
额外的空间。
如果某些编译器是通过函数在任何给定代码路径中执行的最后一个语句,则可以执行尾调用优化(TCO)并删除递归调用。使用TCO,没有与调用堆栈相关的内存开销。
但是,请记住,可能会强制使用O(1)约束来强制您选择特定的(可能是非递归的)算法,因此即使您知道编译器,依赖尾部调用优化也可能是不明智的正在使用已经对您的代码进行了相关的转换。至少,如果你依赖它,你应该明确地说出来并证明你期望通过参考语言规范,编译器文档和/或反汇编来实现TCO。
答案 1 :(得分:26)
extra allowed space is O(1)
表示您的程序只能使用一定量的空间,例如C
。
按照big-O的定义,这意味着程序所需的空间不能取决于输入的大小,尽管C
可以任意大。
因此,如果递归取决于输入 a (通常是这种情况),则程序所需的空间不是O(1)
。
进一步澄清:
始终使用1 Mb
的程序使用O(1)
空格。
总是使用1 Tb
的程序正在使用O(1)
space b 。
使用N Mb
,其中N
为输入的程序不使用O(1)
空格(使用O(N)
空格)。
长话短说,无论何时阅读O(1)
,只需在心理上用常量替换它。
一个。 例如,foo(n)= foo(n - 1),此处维护函数调用所需的堆栈空间为O(n)
湾当O
符号上的材料评论被忽略的常量如何麻烦时,这就是他们所说的
答案 2 :(得分:8)
如果递归的深度根据输入的大小(通常是这样)而增长,则是:您将使用无限量的堆栈内存。要求是用固定数量的内存来解决问题。
答案 3 :(得分:7)
关于其他答案告诉你必须使用的堆栈数量为O(1)
,并且无论输入的大小如何都必须保持不变,如果你想以递归的方式解决问题,它只会离开你有两种可能性:
答案 4 :(得分:0)
存储O(1)的复杂性只是意味着您的算法必须使用恒定的存储量。即它必须在一组10个元素上使用与1000上相同的存储量。
您应该使用迭代来完成此任务。