2012-02-20 9 views
-1

私は簡単な数学的な課題を解決していますが、私はいくつかの問題に直面しています。私は再帰関数を書いていますが、電卓と同じ結果は得られません。例えば、n = 2、a = 2。誰か助けてくれますか?再帰的数式を解決できません

タスク:ここ

1/a + 1/(a+1) +...+ 1/(a(a+1)...(a+n)) 

は、これまでの私のコードです:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace _02__Part_A_ 
{ 
    class Program 
    { 
     float res = 1; 

     public float func3(int n, int a) 
     { 
      if (n == 0) 
       return 1/(a * res); 
      res = res * (a + n); 
      n--; 
      return func3(n, a); 
     } 

     static void Main(string[] args) 
     { 
      Program a = new Program(); 

      float resOFfunc3 = (float)0.5; 
      string n = Console.ReadLine(); 
      string ak = Console.ReadLine(); 

      for (int nn = int.Parse(n); nn > 0; nn--) 
      { 
       resOFfunc3 += a.func3(nn, int.Parse(ak)); 
      } 

      Console.WriteLine(resOFfunc3.ToString()); 
     } 

    } 
} 
+2

「1/a + 1/a(a + 1)+ ... + 1 /(a(a + 1)...(a + n))」ではないでしょうか?関数の2番目の部分を見てください。 – MarcinJuraszek

+5

あなたの名前空間が与えられているので、これは宿題であると仮定しています。 –

+0

float res = 1;これはforループの中でa.func3を呼び出す前にリセットする必要があります – Dampsquid

答えて

0

あなたがループ

namespace _02__Part_A_ 
{ 
    class Program 
    { 

     float res = 1; 


     public float func3(int n,int a) { 

      if (n == 0) 
       return 1/(a*res); 
      res = res * (a + n); 
      n--; 
      return func3(n,a); 
     } 

     static void Main(string[] args) 
     { 
      Program a = new Program(); 

      float resOFfunc3 = (float)0.5; 
      string n = Console.ReadLine(); 
      string ak = Console.ReadLine(); 
      for (int nn = int.Parse(n); nn > 0; nn--) 
      { 
       res = 1; // Need to add this 
       resOFfunc3 += a.func3(nn, int.Parse(ak)); 
      } 

      Console.WriteLine(resOFfunc3.ToString()); 
     } 
    } 
} 
2

ための内部変数RESをリセットする必要がある、それは再帰関数であることを持っています?再帰なしで行うことができます:

float result = 0; 
float temp = 1; 
for(int i = 0; i < n; i++) { 
    temp *= a + i; 
    result += 1/temp; 
} 

私はそれをテストしていませんが、それは動作するはずです非常に簡単なアルゴリズムです。

0

必要でない場合は、再帰の使用をお勧めしません。私はループとして表現しようとしています。なぜなら、再帰は入力に依存してstackoverflowを引き起こすかもしれないからです(特にパラメータが値渡された場合)。例えば

public float func(int n, int a) { 
    float div = 1.0; 
    float result = 0.0; 
    for (int i = 0; i <= n; ++i) { 
     div *= a + i; 
     result += 1.0/div; 
    } 
    return result; 
} 
2

私はあなたのケースをシミュレートしています

  1. あなたがそうでなければ、なぜ最初の場所で再帰関数を作る、グローバル変数としてRESを作成する必要がいけませんか?

  2. はあなたがちょうどFUNC4を呼び出す2つの再帰関数

public float func3(int n, int a) 
{ 
    if (a == 0) return 0; 
    if (n == 0) return a; 
    return 1 * func3(n - 1, a) * (a + n); 
} 

public float func4(int n, int a) 
{ 
    if (a == 0) return 0; 
    if (n == 0) return 1/func3(n, a); 
    return 1/func3(n, a) + func4(n - 1, a); 
} 

を必要としています。

+1

他人の宿題をする方法。私はまた、ここにこのフェンスを持っている、あなたが私に支払う場合、私はあなたに白く塗ってあげるよ –

+0

+1 @SamIam –

関連する問題