当前位置: 首页 > 面试题库 >

递归和记忆

叶英哲
2023-03-14
问题内容

我有一个程序可以通过递归传递大量数据,例如1000个变量。递归将至少运行50或60次。我担心的是,由于没有足够的空间,是否有可能数据在内存位置上被覆盖,或者如果没有内存,那么我会得到一些例外,即程序内存已经用完(我没有收到这样的错误)?

是否存在错误的解决方案,因为该程序没有更多的内存并且在现有位置上被覆盖?


问题答案:

涉及两个存储区域:堆栈和堆。堆栈是保存方法调用的当前 状态
(即局部变量和引用)的位置,堆是存储对象的位置。Hotspot文档说,在64位Linux上,默认情况下每个线程的堆栈为1024kB。可以将堆设为任意大,今天它的大小约为GB。

递归方法同时使用堆栈和堆。首先用尽哪一个取决于实现。例如,考虑一个需要数千个整数的方法:如果将它们声明为局部变量,即:

public void stackOverflow() {
  int a_1;
  int a_2;
  int a_3;
  // ...
  int a_10_000_000;
}

你的程序会陷入困境StackOverflowError。另一方面,如果您将整数组织成一个数组,例如:

public void outOfMemory() {
  int[] integers = new int[10 * 1000 * 1000];
}

堆将很快被填满,程序将以结尾OutOfMemoryError。无论哪种情况,内存都不会损坏或数据被覆盖。但是,在两种情况下,代码都是 错误的
,必须以某种方式进行修复-只是要告诉您我们需要 如何 进一步了解您的程序。



 类似资料:
  • 问题内容: 我在大学为我的Programming II类编写的程序需要一些帮助。这个问题要求人们使用递归来计算斐波那契数列。必须将计算出的斐波那契数存储在一个数组中,以停止不必要的重复计算并减少计算时间。 我设法使程序在没有数组和存储的情况下运行,现在我试图实现该功能,但遇到了麻烦。我不确定如何组织它。我已经浏览了Google并浏览了一些书,但没有太多帮助我解决如何实施解决方案的方法。 上面是不正

  • 本文向大家介绍动态规划和带记忆递归的区别相关面试题,主要包含被问及动态规划和带记忆递归的区别时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 自顶而下和自底而上

  • 让我们回到函数,进行更深入的研究。 我们的第一个主题是 递归(recursion)。 如果你不是刚接触编程,那么你可能已经很熟悉它了,那么你可以跳过这一章。 递归是一种编程模式,在一个任务可以自然地拆分成多个相同类型但更简单的任务的情况下非常有用。或者,在一个任务可以简化为一个简单的行为加上该任务的一个更简单的变体的时候可以使用。或者,就像我们很快会看到的那样,处理某些数据结构。 当一个函数解决一

  • “BASE”表示不只是使用LRU_Cache。所有这些都是“足够快的”--我不是在寻找最快的算法--但是时间让我吃惊,所以我希望我能学到一些关于Python是如何“工作”的东西。 现在很清楚了,我(和前面的许多人一样)只是偶然发现了Python的可变缺省参数。这种行为解释了执行速度的实际和明显的提高。

  • 我对函数式编程很陌生,尤其是下面使用的Scheme。我正在尝试使以下函数是递归的,尾递归的。基本上,该函数的作用是对两个字符串的对齐方式进行评分。当给定两个字符串作为输入时,它会比较每个“列”字符,并根据在称为 scorer 的函数中实现的评分方案(由下面的代码中的函数调用)来累积该对齐的分数。 我有一个想法,用一个帮助函数来累积分数,但我不太确定如何去做,因此我该如何让下面的函数尾递归呢?

  • 主要内容:递归实现,非递归实现二叉树中序遍历的实现思想是: 访问当前节点的左子树; 访问根节点; 访问当前节点的右子树; 图 1 二叉树   以图  1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 遍历节点 1 的左子树,找到节点 2; 遍历节点 2 的左子树,找到节点 4; 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树; 由于节点 4 无右子树,因此节点 2 的左子