Java 需要解释寻找阶乘的两种不同方法
我是一个初学者。我已经学过C。但是现在Java对我来说似乎很难。正如在C编程中一样,我的方法很简单,当我看这本书中的简单任务(如阶乘)的程序时,它给出了非常复杂的程序,如下所示-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;
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的大值而崩溃nlessn!>Integer.MAX_VALUE
在第一种情况下,您添加的行为可以在多个行为
或main()
中重用,而在第二种情况下,您添加的内联
代码是不可重用的。另一个区别是递归与迭代
事实()
基于递归,而main()中的inline
code
使用迭代实现了同样的目标
第一个是递归方法,第二个是迭代方法。C也有递归。可以说,教员并不是演示它的启发性例子。从这里开始:Java的习惯是将功能与主
函数隔离。这就是事实的原因类被创建:它的目的是为给定的数字计算一个阶乘。我同意,对于这样简单的请求,它的开销很大,但对于更复杂的程序,这种将不同的功能相互分离的方法是可取的。您不需要计算fac(3)、fac(4)或fac(5)在您的版本中。在c程序中,也不建议使用内联
代码,除非它非常小,对吗?:)您应该在函数
中对逻辑进行分组possible@dreamer-是的。这不是建议的。但是这与上面的答案有什么关系?他提到“像好的旧C程序一样”,它在一个方法中包含所有逻辑