当前位置: 首页 > 知识库问答 >
问题:

当我们重复调用递归函数时,局部变量只得到一个内存,还是每次都在Java?

公孙棋
2023-03-14
int fact(int n){
    int result;
    if(n==1) return 1;
    result=fact(n-1)*n;
    return result;
}

所以,如果我调用fact(3),那么每个调用结果变量将在堆栈中获得单独的内存?

(如果这是一个愚蠢的问题,很抱歉,但我似乎无法掌握这个概念。)

共有2个答案

蒙化
2023-03-14

递归方法与任何其他方法相同。每次调用一个递归方法(从另一个方法或在它本身)时,它会推入堆栈中的单独内存,然后在返回时弹出。

欧阳君浩
2023-03-14

是的。但在这种情况下不需要使用变量:

int fact(int n){
    if (n==1)
       return 1;
    return fact(n-1)*n;
}

每个方法调用都会占用内存中的一些空间。

在递归中内存是如何分配给不同的函数调用的?

当从main()调用任何函数时,在堆栈上为其分配内存。递归函数调用自己,被调用函数的内存分配在分配给调用函数的内存之上,并且为每个函数调用创建不同的局部变量副本。当达到基大小写时,函数将其值返回给调用它的函数,并取消分配内存,进程继续。

来自Java的递归

 类似资料:
  • 我正在编写一个函数来展平嵌套数组(Python)。例如将[1,2,[3]]变成[1,2,3],[[1,2,[3]],4]变成[1,2,3,4]等。 我有以下内容: 所以这个想法是让函数是递归的,以处理嵌套到未知深度的情况。我的问题是每次遇到嵌套列表都会被重新初始化(当被递归调用时)。 在进行递归调用时,如何保持展平数组的状态?

  • 我有一个像下面这样的递归方法 我发现本地变量无法释放,如果我将最大堆大小设置为50M(-xmx50M),它将在第44次调用时满足OOM 但将其更改为for循环则不存在此问题 那么为什么在递归中叫它不释放局部变量的内存呢?

  • 即使不适用局部变量,函数也可以递归的调用自身。 例子24-16. 斐波那契序列 #!/bin/bash # fibo.sh : 斐波那契序列 (递归) # 作者: M. Cooper # License: GPL3 # ----------算法-------------- # Fibo(0) = 0 # Fibo(1) = 1 # else # Fibo(j) = Fibo(j-1) + Fi

  • 问题内容: 如果我有这个: 我之前已定义,因此效果很好。 我的问题是在第6行中调用。我试图用相同的定义在第一个函数之外进行定义,但是即使调用,它也始终相同。 我希望每次调用第一个函数然后再调用第二个函数时,都具有一个不同的。 我能做到这一点,而不界定外? 问题答案: 是的,您应该考虑在一个类中定义您的函数,并使word成为成员。这比较干净 创建类后,您必须将其实例化为对象并访问成员函数。 另一种方

  • 问题内容: 当我基于C ++知识使用Java时,我喜欢使用以下方式初始化变量。 一段时间后,我改变了习惯 我碰到了其他源代码,有些使用1st约定,有些使用2nd约定。 我可以知道大家都推荐哪种惯例,为什么? 问题答案: 我发现第二种样式(一口气声明和初始化)更出色。原因: 一目了然,该变量是如何初始化的。通常,在读取程序并遇到变量时,首先会去声明它(在IDE中通常是自动的)。使用样式2,你会立即看

  • 问题内容: 我正在使用函数,这样我的程序就不会一团糟,但我不知道如何将局部变量变成全局变量。 问题答案: 这是两种实现相同目的的方法: 使用参数并返回(推荐) 运行时,将获得以下输出 使用全局变量(永远不要这样做) 现在您将获得: