4

私は再帰を練習していますが、なぜこの方法が機能しないように見えるのかわかりません。何か案は?

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

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

ありがとう

4

8 に答える 8

12

あなたのコードは動作しているように見えますが、戻り値で何もしていません。メソッド呼び出しfactまたはfact(5)内部に配置してSystem.out.println、何が得られるかを確認してください。

于 2010-05-10T13:08:49.817 に答える
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"
    }
}
于 2010-05-10T13:23:35.920 に答える
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);
}

しかし、あなたのコードは間違っていません。これは単なる別のスタイルです(三項演算子に慣れていない場合は、そのままにしてください)。このような場合は、三項演算子を使用することをお勧めします(コードに副作用がないことに注意してください)。

于 2010-05-10T20:53:24.283 に答える
1

正常に動作します。あなたはそれを何にも割り当てていません。これが機能することを証明するテストです。

@Test
public void testYourFactorialMethod() {
    assertEquals(120, fact(5));
}
于 2010-05-10T13:14:58.547 に答える
0
static int factorial(int x) {    
    int result;    
    if (x == 1) {    
        return 1;    
    }    
    // Call the same method with argument x-1    
    result = factorial(x – 1) * x;    
    return result;    
}

完全な例については、これを確認してください

http://answersz.com/factorial-program-in-Java-using-recursion/

于 2014-12-30T06:26:40.747 に答える
-7

再帰的な方法でフィボナッチを書くのは完全に間違っています!!

これは、アルゴリズムの良し悪しがプロジェクトにどのように影響するかについての古い有名な例です。

フィボナッチを再帰的に書くと120、結果を得るために計算に 36 年が必要になります!!!!!!

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

dot net 4.0 には新しい型名 BigInteger があり、それを使用してより良い関数を作成できます

システムを使用して; 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、1 秒未満で計算できます。それで

再帰的な方法を使用することは、必ずしも良い考えではありません

上記のコードは、ペルシャ語で書かれた Vahid Nasiri ブログからインポートされました

于 2010-05-10T13:23:23.057 に答える