2013-10-13 49 views
0

这里是我的代码:如何从for循环中返回一个值?

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

你真的想在这种情况下返回吗? –

+1

一个方法返回一次。 –

+0

从'for'循环中删除'return'语句。只是从'2'迭代到'n'并计算'factorial'并且一次迭代,简单地返回'factorial' :-)为什么要做额外的乘法,任何乘以1的值总是相同的值! –

回答

4

您需要删除for循环中的return f;语句。 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 
} 
+0

感谢信用:) –

+0

祝贺我从10k +1 – arynaq

+0

@RaviThapliyal - 我错过了,但你抓住了它,所以我非常高兴能给你信贷(你应得的)和+1作为以及:) – SudoRahul

1

不要回到这里:

for (int i = 1; i <= n; ++i) { 
    f *= i; 
    return f; // here! 
} 

而是在你的循环结束。您需要在循环的所有迭代中累积最终结果。

1

三个问题的代码:

  1. 开始在i = 1
  2. 呼叫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 
    } 
    
  3. 返回一次;循环结束

    for (int i = 1; i <= n; ++i) { 
        f *= i; 
        // return f; // (3) don't return from here 
    } 
    return f; 
    
0

嗯...你以后排序觉得yield操作(这在一些语言,但的Java)。 yield是一个构造,它说:“从函数返回一个值,但为我现在所在的地方添加书签,并让我稍后再回来”。另一方面,return表示“回报价值并放弃我所做的一切”。在Java中,你不能“搁置一个循环”,稍后再回来。

我那已了解你正在尝试实现的是不重复计算(和正要离开已经在其他的答案提出了回报浪费时间的表现非常糟糕; justr尝试一些更大的数字.. )。你可以通过不输出结果来实现它,但将它们存储在一个数组中。像这样:

public static void main(String [] args){ Scanner console = new Scanner(System。在);

// 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; 

}

注意上面可以写更好 - 我试图修改代码尽可能少。