如何从for循环中返回值?

时间:2013-10-13 16:42:54

标签: java for-loop

这是我的代码:

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方法?

4 个答案:

答案 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)

代码有三个问题:

  1. i = 1
  2. 开始
  3. 致电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
    }
    
  4. 返回一次;循环结束后

    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;

}

请注意,上面的内容可以写得更好 - 我尝试尽可能少地修改代码。