繁体   English   中英

我想使用default和parameterize构造函数找到数字的阶乘。 输出为0

[英]I want to find the factorial of a number using a default and parameterize constructor. getting output as 0

我已经声明了一个默认值和一个参数化构造函数。 使用单个对象我同时调用构造函数和函数。 当我运行程序时,我得到输出为0而不是获得阶乘。 我初始化f = 1仍然输出为0。

class Factorial
{
    int num, f;

    Factorial()
    {
        f = 1;
    }

    Factorial(int n)
    {
        num = n;
    }

    public int getFactorial()
    {
        for(int i = 1; i <= num; i++)
        {
            f = f * i;
        }   
        System.out.println("Factorial= " + f);
        return f;
    }

    public static void main(int m)
    {     
        Factorial obj = new Factorial();
        obj = new Factorial(m);
        obj.getFactorial();
    }
}

这是因为当使用factorial(int n)构造函数初始化类时, f的初始值保持为零。

在初始化程序中将f设置为1以解决此问题:

int n, f = 1;

Factorial() {
}

Factorial(int n) {
    num = n;
}

这给你的课留下了一个大问题:多次调用getfactorial将改变类的状态,增加阶乘的值。 您可以通过创建一个boolean变量来指明是否已经计算了阶乘,并在执行计算后返回f来解决此问题。

如果您不需要“懒”的计算,使f在方法的局部变量。

作为一种好的做法,变量应具有最小可能范围(首选本地,然后是实例)。 或者换句话说:当您想要在同一个类的多个方法之间共享某个日期时,应该使用状态变量。 但在你的情况下呢? 因子是一个操作,可以从一个单一参数一步计算:无需进一步处理。

所以,我建议你将你的课程重构为:

  1. 删除状态变量:将它们转换为局部变量或方法的参数。
  2. 将factorial方法设置为static(正是因为它不需要状态变量)。
  3. 另一个小细节:参数通过一个字符串数组从命令行传递到main方法 - 总是。
  4. 只需一种方法就可以将所有输入和输出留给用户,最好是main方法。

所以它将保持如下:

class Factorial
{
    public static int getFactorial(int num)
    {
        int f=1;
        for (int i = 1; i <= num; i++)
        {
            f = f * i;
        }   
        return f;
    }

    public static void main(String[] args)
    {     
        int m=Integer.parseInt(args[0]);
        int factorial=Factorial.getFactorial(m);
        System.out.printf("factorial of %d is %d\n", m, factorial);
    }
}

更简单,不是吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM