2010-05-10 447 views
4

我正在練習遞歸,我看不出爲什麼這個方法似乎不起作用。 任何想法?基本的遞歸方法 - 階乘

public void fact() 
    { 
     fact(5); 
    } 

    public int fact(int n) 
    { 
     if(n == 1){ 
      return 1; 
     } 
     return n * (fact(n-1)); 
    } 
} 

感謝

+3

究竟是什麼意思「不工作」?它做什麼,你期望它做什麼? – 2010-05-10 13:08:13

回答

12

你的代碼似乎工作,但你沒有做與返回的任何有價值的東西,把方法調用factfact(5)一個System.out.println的內部,看看你會得到什麼。

1

工作正常。你沒有把它分配給任何東西。這是一個可以證明它有效的測試。

@Test 
public void testYourFactorialMethod() { 
    assertEquals(120, fact(5)); 
} 
+1

不是'assertEquals()'一個JUnit API方法嗎?我猜JUnit尚未在這裏啓用,所以你應該更明確一些。如果它實際上是一個常規的API方法,_mea culpa_。 – Pops 2010-05-10 13:25:48

+0

是的 - 這是JUnit - 我試圖展示的是他的方法有效。如果你閱讀我的評論,我不建議他在任何地方插入我的代碼。 – andyczerwonka 2010-05-10 16:42:09

-7

用遞歸方法寫斐波納契是完全錯誤的!

這是因爲如果你寫Fibonatcci遞歸,計算120你需要36年toget結果的好/壞Algorythm如何影響任何項目

昔日經典例子!!!!!!

public static int Fibonacci(int x) 
{ // bad fibonacci recursive code 
if (x <= 1) 
     return 1; 
return Fibonacci(x - 1) + Fibonacci(x - 2); 
} 

點網4.0有一個新的類型名稱BigInteger和你可以用它來製作使用系統更好的功能

; using System.Collections.Generic;使用System.Numerics的 ; //需要參考。該裝配

namespace Fibonaci 
{ 
public class CFibonacci 
{ 
    public static int Fibonacci(int x) 
    { 
     if (x <= 1) 
      return 1; 
     return Fibonacci(x - 1) + Fibonacci(x - 2); 
    } 

    public static IEnumerable<BigInteger> BigFib(Int64 toNumber) 
    { 
     BigInteger previous = 0; 
     BigInteger current = 1; 

     for (Int64 y = 1; y <= toNumber; y++) 
     { 
      var auxiliar = current; 
      current += previous; 
      previous = auxiliar; 
      yield return current; 
     } 
    } 
} 
} 

,您可以使用它像

using System; 
using System.Linq; 

namespace Fibonaci 
{ 
class Program 
{ 
    static void Main() 
    { 
     foreach (var i in CFibonacci.BigFib(10)) 
     { 
      Console.WriteLine("{0}", i); 
     } 

     var num = 12000; 
     var fib = CFibonacci.BigFib(num).Last(); 
     Console.WriteLine("fib({0})={1}", num, fib); 

     Console.WriteLine("Press a key..."); 
     Console.ReadKey(); 
    } 
} 
} 

在這種情況下,你可以計算比第二12000少。所以

使用遞歸methos並不總是一個好主意

以上內容來自Vahid Nasiri blog whiche wrote in Persian

+3

誰在這裏回答你的問題? – Hendrik 2010-05-10 13:27:49

+6

他不是在做Factorial,而不是Fibonacci? – corsiKa 2010-05-10 13:28:34

+3

-1:雖然遞歸可能不是編寫階乘方法的最佳方式,但它是介紹遞歸概念的簡單示例。不要對提問者爲什麼提出問題做出假設。另外,120的計算來自事實(5);這當然不需要36年的時間來處理。 – Pops 2010-05-10 13:28:44

6

遞歸部分是精細導入的代碼;你只是沒有使用它的return值,它會被丟棄。這裏是你的階乘代碼一個完整的Java應用程序,小幅飲譽式教育目的:

public class Factorial { 
    public static String fact(int n) { 
     if(n == 1){ 
      return "1"; 
     } 
     return n + " * " + (fact(n-1)); // what happens if you switch the order? 
    } 
    public static void main(String[] args) { 
     System.out.println(fact(5)); 
     // prints "5 * 4 * 3 * 2 * 1" 
    } 
} 
+1

+1熱爵士樂。 – Pops 2010-05-10 13:30:55

2

你的代碼的簡化版本:

public int fact(int n) 
{ 
    if(n == 1){ 
     return 1; 
    } 
    return n * (fact(n-1)); 
} 

可能只是:

public int fact(int n) 
{ 
    return n == 1 ? 1 : n * fact(n - 1); 
} 

但是你的代碼沒有錯,這只是另一種風格(如果你不習慣三元運算符保持它的方式)。我更喜歡在這些情況下使用三元運算符(注意代碼是無副作用的)。

+0

算法沒有錯,就像7小時前其他3個海報所說的那樣。 OP只是沒有做任何程序輸出。 – 2010-05-10 21:04:06

+0

但他的代碼風格令人困惑。兩個出口點,一個不明確的別名和不必要的括號。這是我的觀點。問題不僅僅是回答。 – 2010-05-11 10:20:08

+0

這兩個退貨沒有錯。此外,初學者可能會難以理解條件運算符的使用。 – helpermethod 2010-05-12 23:10:31

1
public class Recursive { 

    public static void main(String[] argss) { 
     System.out.print(fac(3)); 
    } 
    public static int fac(int n) { 
     int value = 0; 
     if (n == 0) { 
      value = 1; 
     } else { 
      value = n * fac(n - 1); 
     } 
     return value; 
    } 
} 
// out put 6 
1

嘗試是這樣的: (或者,也許試試這個直接)

public class factorial { 

    private static int factorial(int n){ 
     if (n > 1) { 
      return n * (factorial(n-1)); 
     } else { 
      return 1; 
     } 
    } 

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