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

在Java中使用递归的阶乘

充运浩
2023-03-14
问题内容

我正在使用《 Java:完整参考》这本书来学习Java。目前,我正在从事递归主题。

请注意: 关于stackoverflow也有类似的问题。我搜索了它们,但没有找到解决问题的方法。我对以下程序中的逻辑感到困惑。

如果我运行下面的程序,它将产生正确的输出,但是我不理解其逻辑。

  • 我不理解以下行中的逻辑: result = fact(n-1)* n;
  • 据我所知,如果我们按以下程序所示传递n = 4的值,
  • 然后,将3 * 4存储在结果中,即12。
  • 再次,事实(n-1)被调用。然后n变成3。
  • 然后将2 * 3存储在结果中,以替换之前的12。
  • 我认为您了解我被困住/感到困惑的地方。

  • 谢谢。

class Calculation
{
    int fact(int n)
    {
        int result;

       if(n==1)
         return 1;

       result = fact(n-1) * n;
       return result;
    }
}

public class Factorial
{
     public static void main(String args[])
     {
       Calculation obj_one = new Calculation();

       int a = obj_one.fact(4);
       System.out.println("The factorial of the number is : " + a);
     }
}

问题答案:

result是方法的局部变量fact。因此,每次调用事实方法时,结果都存储在与先前的事实调用不同的变量中。

因此,当以3作为参数调用事实时,您可以想象其结果是

 result3 = fact(2) * 3
 result3 = result2 * 3
 result3 = 1 * 2 * 3


 类似资料:
  • 问题内容: 这两种获取阶乘(循环与递归)的方法中哪种更有效/更快?如果可以改进,那又如何呢? 语言:Java 问题答案: 因为没有方法调用的开销,所以for循环将更加有效。(作为一般规则,循环几乎总是比递归更有效率) 为了解释为什么您必须深入了解调用方法和调用堆栈时发生的事情。 基本上,当您调用一个方法时,它需要一些空间来使用(例如其局部变量之类的东西),它还需要空间以用于将传入的参数传递给它,并

  • 我尝试编写一个递归方法,将从0到输入数字的所有阶乘值相加,并将结果作为双精度返回。我使用递归阶乘方法来计算各个阶乘。但我不明白如何使所有阶乘求和的方法成为递归方法,使用两个递归而不是一个递归和for循环。 这是密码!

  • 我刚刚开始学习递归,并能够使用它编写一个简单的阶乘程序,没有太多问题。现在我正在尝试编写一个递归方法,该方法以相反的顺序写入数组,但我不知道我做错了什么。我错过了什么?非常感谢。

  • 我是动态编程的新手,所以我看了这个例子。 你有N级台阶要爬。一次只能爬1、2级台阶。找到到达第n步的方法数。 其解为:T(n)=T(n-1)+T(n-2) 我做的最后一步是什么? 我不是在n-1步就是n-2步。现在怎么能达到第N步的路数是达到n-1步和n-2步的路数之和。我无法获得理解逻辑所需的直觉,请帮帮我。 附注:我可以用递归的方式编写代码。

  • 本文向大家介绍C#采用递归实现阶乘的方法,包括了C#采用递归实现阶乘的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#采用递归实现阶乘的方法,供大家参考之用。通常来说,如果想实现一个阶乘,比如6 * 5 * 4 * 3 * 2 * 1,首先想到的可能是循环遍历。 如下示例所示: 但以上的阶乘还有一种实现方式:6 * (6-1) * (6-2) * (6-3) * (6-4) * (

  • 我试图用递归得到一个字符串中最长的回文。以下是我的代码: 所以这段代码并不完全有效,我不知道如何解决它。这是我的解释: 假设输入字符串是:“i更喜欢”。 我检查它的方法是: 一个展示的图像 这个字符串中最长的回文是“refer”。 我将遍历我的代码: 句子被发送到回文函数。 这个if语句是为了检查字符串是否是回文。我不更改实际字符串,因为我想完全返回原始字符串。我替换所有空格并使其小写,并检查它是