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

递归与For循环-阶乘,Java

封俊艾
2023-03-14
问题内容

这两种获取阶乘(循环与递归)的方法中哪种更有效/更快?如果可以改进,那又如何呢?

语言:Java

private static long factrecur(int n) {
    if (n == 0) {
        return 1;
    }
    else {
        return n * factrecur(n-1);
    }

}

private static long factloop(int a) {
    long total = 1;
    for (int b=a;b>=1;b--) {
        total *= b;
    }
    return total;
}

问题答案:

因为没有方法调用的开销,所以for循环将更加有效。(作为一般规则,循环几乎总是比递归更有效率)

为了解释为什么您必须深入了解调用方法和调用堆栈时发生的事情。

基本上,当您调用一个方法时,它需要一些空间来使用(例如其局部变量之类的东西),它还需要空间以用于将传入的参数传递给它,并且还需要一个地方来存储它应该在何时返回的地址它完成执行。通过将值“压入”堆栈来动态提供此空间。该堆栈空间将一直被占用,直到该方法返回时才“弹出”。

因此,请考虑这种情况下的递归:每次从自身内部调用该方法时,都会将更多数据压入堆栈,而不会从您所在的方法返回(因此不会释放调用方法所占用的堆栈空间)。随着递归的深入,内存量将增加。

相反,您编写的for循环仅使用一次堆栈帧推送提供的固定内存量。



 类似资料:
  • 我正在研究CodeChef中的一个问题,我需要计算n个数字的阶乘。 用户输入一个数字,该数字确定要对多少整数执行阶乘计算,然后输入要计算的数字。 我的问题是乘法本身。例如,如果我有一个int==5,那么结果将是20(它将仅通过最后一个阶乘计算n,而不是所有阶乘) 这就是问题所在: 外部循环定义要执行的计算数量。 内部循环通过迭代numberToProcess的每个索引并将其乘以每个小于要计算的数字

  • 问题内容: 我正在使用《 Java:完整参考》这本书来学习Java。目前,我正在从事递归主题。 请注意: 关于stackoverflow也有类似的问题。我搜索了它们,但没有找到解决问题的方法。我对以下程序中的逻辑感到困惑。 如果我运行下面的程序,它将产生正确的输出,但是我不理解其逻辑。 我不理解以下行中的逻辑: result = fact(n-1)* n; 据我所知,如果我们按以下程序所示传递n

  • 问题内容: 是否每个递归函数都有一个等效的for循环?(两者都达到相同的结果)。 我有这个递归函数: 假设单词是Set [],并且单词[i] =单词长度为i的集合。 我想做的是:使用一个单词(例如,“ stackoverflow”,没有空格)启动递归,我试图查找该单词是否可以切成子单词(“ stack”,“ over”,“ flow”) ..子词的最小长度为3,并且假设长度为i的子词在Set wo

  • 我试图理解我为一个问题找到的解决方案:“给你不同面额的硬币和总金额。写一个函数来计算组成该金额的组合数。你可以假设每种硬币的数量是无限的。” 我的问题是,如果我用change(3,[2])运行函数,为什么它会输出0。我很难理解在一个递归调用currentCoin变得未定义之后,当程序到达该调用中的for循环时,它是如何不再调用change函数的。为什么它不会在或正在空数组上使用。在for循环中似乎

  • 问题内容: 我在Javascript中遇到了奇怪的行为。我懂了 “对象不支持此属性或方法” 以下代码中的函数异常: 当我使用以下代码更改代码时,问题消失了: inside的值是多少? 问题答案: 不要用于数组迭代。 重要的是要了解,用于访问索引的Javascript数组的方括号语法()实际上是从… 继承的。 该结构不能像其他语言(php,python等)中所看到的那样更传统。 Javascript

  • 本文向大家介绍Java算法之递归算法计算阶乘,包括了Java算法之递归算法计算阶乘的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享的java算法计算阶乘,在学习Java课程时经常会遇到求阶乘问题,今天接跟大家一起探讨一下 代码如下: 运行结果: