这个问题的基础:
今年夏天,我将以CS学位毕业,我从来没有让教授强调过Stack的重要性。然而,我有多个项目,都集中在递归的使用上。我发现递归很有用,而且令人兴奋,我经常在我的个人项目中使用它。
我最近参加了一次面试,面试官对递归解决他们的问题感到非常失望。他们想要堆栈解决方案。我做了很多研究,但我还是不知道什么时候该用。
给出了以下演示:
public class TestCode {
static long startTime = 0;
static long stopTime = 0;
static long totalTime = 0;
public
在最近为我的编程2类分配的任务中,我们通过使用13,040个字符串填充一个java ArrayList来测试搜索的效率。顺序搜索明显比二进制搜索慢,因为复杂性不同,代码实际需要循环遍历代码的次数也不多。
然而,迭代二进制搜索和递归二进制搜索具有相同的比较量。例如:
sequentialSearch(): 'some_word' found in ArrayList at index 13,020 - comparisons: 13,021
比较是计算机实际检查用户的"some_word“是否等于值ArrayList的次数。
iterativeBinarySearch()
有一些递归算法可以很快地填充堆栈。一种解决方案是将堆栈显式化,从而将算法转换为迭代算法。
但我注意到,使用显式堆栈会使算法速度更慢(这可能不会让我感到惊讶)。是否有任何通用的C++指南使显式堆栈更快?它们是否有可能比最初的递归算法运行得更快?
编辑:--我为其编写了一个显式堆栈的函数如下所示。我还粘贴了迭代代码。由于某些原因,使用std::vector而不是std::stack更快,这是相当令人惊讶的。
// A(m, n) = n + 1 if m = 0
// = A(m - 1, 1) if m > 0 and
考虑以下代码:
void func()
{
int p;
...
if (p > MAX) {
struct my_struct s;
...
/* here we access the contents 's' as '&s' */
}
}
在这个片段中,s在堆栈上。是否保证编译器将所有结构字段初始化为零?
我开始学习ocaml,并且真正体会到了递归在语言中的威力。然而,我担心的一件事是堆栈溢出。
如果ocaml使用堆栈进行函数调用,它最终不会溢出堆栈吗?例如,如果我有以下函数:
let rec sum x =
if x > 1 then f(x - 1) + x
else x;;
它最终一定会导致堆栈溢出。如果我在c++中做同样的事情(使用递归),我知道它会溢出。
所以我的问题是,有没有内置的保护措施来防止函数式语言溢出堆栈?如果不是,它们是不是像这样不太有用,因为上面的求和算法是用for循环的过程化风格编写的,可以处理任何数字(与整数溢出无关)?
我有一个二叉树的实现和一个深度函数来计算它的深度:
type 'a btree =
| Empty
| Node of 'a * 'a btree * 'a btree;;
let rec depth t = match t with
| Empty -> 0
| Node (_, t1, t2) -> 1 + Int.max (depth t1) (depth t2)
这里的问题是“深度”是递归的,当树太大时会导致堆栈溢出。
我读过有关尾递归的文章,以及编译器如何将其优化为while循环以删除堆栈调用。
您将如何使此函数尾递归,或使其使用whi