Java 需要解释寻找阶乘的两种不同方法

Java 需要解释寻找阶乘的两种不同方法,java,Java,我是一个初学者。我已经学过C。但是现在Java对我来说似乎很难。正如在C编程中一样,我的方法很简单,当我看这本书中的简单任务(如阶乘)的程序时,它给出了非常复杂的程序,如下所示- class Factorial { // this is a recursive method int fact(int n) { int result; if(n==1) return 1; result = fact(n-1) * n;

我是一个初学者。我已经学过C。但是现在Java对我来说似乎很难。正如在C编程中一样,我的方法很简单,当我看这本书中的简单任务(如阶乘)的程序时,它给出了非常复杂的程序,如下所示-

class Factorial {
    // this is a recursive method
    int fact(int n) {
        int result;
        if(n==1) return 1;
        result = fact(n-1) * n;
        return result;
    }
}
class Recursion {
    public static void main(String args[]) {
        Factorial f = new Factorial();
        System.out.println("Factorial of 3 is " + f.fact(3));
        System.out.println("Factorial of 4 is " + f.fact(4));
        System.out.println("Factorial of 5 is " + f.fact(5));
    }
}
相反,当我制作自己的程序(如下所示)保持简单时,它也很有效且简单。有人能告诉我这两者的区别吗

public class Simplefacto {

   public static void main(String[] args) {
       int n = 7;
       int result = 1;
       for (int i = 1; i <= n; i++) {
           result = result * i;
       }
       System.out.println("The factorial of 7 is " + result);
   }
}
公共类Simplefacto{
公共静态void main(字符串[]args){
int n=7;
int结果=1;

对于(int i=1;i第一种方法是递归。这并不总是快速和容易的。(如果不小心,通常会导致StackOverflowerError)。第二种方法是正常的for循环。有趣的是,这两种方法即使在“C”中也有效


我认为您不应该将Java程序与C程序进行比较。这两种语言的设计原因不同。

这些程序之间有两个主要区别:

  • 程序1使用递归
  • 程序2使用命令式方法
  • 程序1使用一个封装了所有程序逻辑的类
  • 程序2在一个方法中具有所有逻辑“就像好的旧C程序”

    • 第一种方法是递归的。这意味着该方法会调用自身,其背后的思想是递归(如果使用得当)可以生成非常干净的代码,非常类似于您的
      阶乘方法。正确格式化的方法应该更像:

      private int factorial(int n) {
          if(n==1) return n;
      
          return fact(n-1) * n;
      }
      
      这是一个两行的阶乘计算器,非常简洁。问题是当
      n
      的值较大时,可能会遇到问题。也就是,臭名昭著的
      堆栈溢出错误


      第二种方法被称为迭代法。迭代法通常涉及某种形式的循环,是递归的另一种选择。其优点是,它们使代码可读性强,易于理解,即使代码有点冗长冗长。此代码更健壮,不会因
      n
      ,u的大值而崩溃nless
      n!>Integer.MAX_VALUE
      在第一种情况下,您添加的行为可以在
      多个行为
      main()
      中重用,而在第二种情况下,您添加的
      内联
      代码是不可重用的。另一个区别是
      递归与迭代
      事实()
      基于递归,而
      main()中的
      inline
      code
      使用
      迭代实现了同样的目标

      第一个是递归方法,第二个是迭代方法。C也有递归。可以说,教员并不是演示它的启发性例子。从这里开始:Java的习惯是将功能与
      函数隔离。这就是
      事实的原因类被创建:它的目的是为给定的数字计算一个阶乘。我同意,对于这样简单的请求,它的开销很大,但对于更复杂的程序,这种将不同的功能相互分离的方法是可取的。您不需要计算fac(3)、fac(4)或fac(5)在您的版本中。在c程序中,也不建议使用
      内联
      代码,除非它非常小,对吗?:)您应该在
      函数
      中对逻辑进行分组possible@dreamer-是的。这不是建议的。但是这与上面的答案有什么关系?他提到“像好的旧C程序一样”,它在一个方法中包含所有逻辑