这是我的代码:
import java.util.*;
public class factorialdisplay {
// Main Method. Prints out results of methods below.
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
// Asks user for input
System.out.println("Please enter a number: ");
int n = console.nextInt();
for (int i = 0; i <= n; ++i) {
System.out.println(i + "! = " + factorial(n));
}
}
public static int factorial (int n) {
int f = 1;
for (int i = 1; i <= n; ++i) {
f *= i;
return f;
}
return f;
}
}
我正在尝试获取输出:
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
但是当我运行代码时,我得到了这个:
0! = 1
1! = 1
2! = 1
3! = 1
4! = 1
5! = 1
我的问题是,如何通过for
静态方法将factorial
循环的每次迭代结果返回到main
方法?
答案 0 :(得分:4)
您需要删除return f;
循环中的for
语句。 if
内的返回将始终在第一次迭代后立即返回到调用方法。这就是为什么你得到1作为所有因子的结果。
public static int factorial (int n) {
int f = 1;
for (int i = 1; i <= n; ++i) {
f *= i;
// return f; // Not needed - this is causing the problem
}
return f; // This is your required return
}
正如Ravi指出
for (int i = 1; i <= n; ++i) { // well 0 will return 1 as well, so no prob unless you don't need 0 factorial
System.out.println(i + "! = " + factorial(i)); // you need to pass i instead of n as i is the counter here
}
答案 1 :(得分:1)
不要回到这里:
for (int i = 1; i <= n; ++i) {
f *= i;
return f; // here!
}
而是在你的循环结束时。您需要在循环的所有迭代中累积最终结果。
答案 2 :(得分:1)
代码有三个问题:
i = 1
致电factorial(i)
而非factorial(n)
for (int i = 1; i <= n; ++i) { // (1) start at i = 1
System.out.println(i + "! = " + factorial(i)); // (2) pass i not n
}
返回一次;循环结束后
for (int i = 1; i <= n; ++i) {
f *= i;
// return f; // (3) don't return from here
}
return f;
答案 3 :(得分:0)
嗯...你有点想到yield
操作(某些语言可用,但不是 Java)。 yield
是一个构造,它表示:“从函数中返回一个值,但将我当前所在的位置加入书签,让我稍后再回过头来”。另一方面,return
表示“回报价值并放弃我所做的一切”。在Java中,你不能“保持循环”并稍后再回来。
我认为你想要达到的目的不是通过重复计算来浪费时间(而只是留下在其他答案中提出的回报对性能来说非常糟糕; justr尝试一些更大的数字......)。您可以通过不产生结果来实现它,而是将它们存储在数组中。像这样:
public static void main(String [] args){ 扫描仪控制台=新扫描仪(System.in);
// Asks user for input
System.out.println("Please enter a number: ");
int n = console.nextInt();
int[] results = factorials(n);
for (int i = 0; i <= n; ++i) {
System.out.println(i + "! = " + results[i]);
}
和功能:
public static int[] factorials (int n) {
int[] results = new int[n + 1];
results[0] = 1;
int f = 1;
for (int i = 1; i <= n; ++i) {
f *= i;
results[i] = f;
}
return results;
}
请注意,上面的内容可以写得更好 - 我尝试尽可能少地修改代码。