2013-10-13 91 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; 

}

注意上面可以寫更好 - 我試圖修改代碼儘可能少。