java将一个范围内的数字相乘

java将一个范围内的数字相乘,java,Java,} } 为什么带while的代码会给我一个错误,而另一个带if语句的代码会工作,这段代码应该将最小值和最大值之间的所有数字相乘,例如factorial4,8=8*7*6*5*4我不确定您会得到什么错误,但是,如果将对factorial的递归调用放在while循环中,则会为循环的每个迭代创建一个递归调用。每个递归调用都有自己的while循环,有自己的一组递归调用,最后在堆栈上有很多调用 此外,在两个版本的程序中,您都没有对递归调用的返回值进行任何操作。因此,虽然您的第一个版本没有出现错误,但它不会

}

}


为什么带while的代码会给我一个错误,而另一个带if语句的代码会工作,这段代码应该将最小值和最大值之间的所有数字相乘,例如factorial4,8=8*7*6*5*4

我不确定您会得到什么错误,但是,如果将对factorial的递归调用放在while循环中,则会为循环的每个迭代创建一个递归调用。每个递归调用都有自己的while循环,有自己的一组递归调用,最后在堆栈上有很多调用

此外,在两个版本的程序中,您都没有对递归调用的返回值进行任何操作。因此,虽然您的第一个版本没有出现错误,但它不会正确计算阶乘。试着这样做:

 public class Main {

public static int sum = 1;

public static void main(String[] args) {
    System.out.println(factorial(4,8));
}

public static  long factorial(long min , long max ){

    while(max >= min) {
        sum *= max;
        max -= 1;
        factorial(min ,max);
    }
    return sum;
}
你可以这样调用它:

public static long factorial(long min, long max, long result) {

    if(max >= min) {
        result *= max;
        max -= 1;
        return factorial(min, max, result);
    }
   return result;
}

如果您将干运行代码,您将观察问题所在。 在第二种情况下,您混合了迭代和递归

因子2,4:

总和=4 最大值=3

总和=4*3 最大值=2

总和=4*3*2 最大值=1

总和=4*3*2 最大值=3

因此,在这一步中,您可以看到,当递归调用返回时,它使用max的本地副本,即3。这会导致额外的乘法运算


在代码1中不是这种情况,在代码1中不执行while循环。

带有while的代码循环并递归调用factorial。但是在while版本中,对阶乘的结果不做任何处理。您可以简单地删除这一行。while语句本身就是一个循环。所以它试图运行一个循环,同时再次递归地调用自己。因此,如果您从循环的底部删除factorialmin,max,while应该可以工作。另外,当您发布给出任何错误的代码时,请详细解释错误是什么,以及错误消息或预期与实际输出。仅供参考:两者都很可怕。删除字段和。递归方法不应更新字段。重新思考您的逻辑。最初,我指出OP也没有使用递归函数的返回值,但我们有点错误,因为每个递归调用都会更改sum的值,sum是对象的静态属性。因此,在某种意义上,结果是不容忽视的。尽管这显然不是做itAh的最佳方式,是的,你是对的@KyrSt,我错过了。我想这只是做递归的常用方法。
public static long factorial(long min, long max, long result) {

    if(max >= min) {
        result *= max;
        max -= 1;
        return factorial(min, max, result);
    }
   return result;
}
factorial(4, 8, 1);