2012-02-20 5 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 ​​+ 1) ... (a + n))'이 아니어야합니까? 함수의 두 번째 부분을 살펴보십시오. – MarcinJuraszek

+5

당신의 네임 스페이스가 주어진다면 숙제라고 가정합니다 ... –

+0

float res = 1; 이것은 a.func3를 호출하기 전에 for 루프 내에서 재설정해야합니다. – 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

에 대한 내부 변수 고해상도를 재설정 필요 ? 재귀없이 수행 할 수 있습니다.

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. 당신은 입술 전역 변수로, 그렇지 않으면 왜 처음에 재귀 기능을해야 해달라고?

  2. 당신은 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); 
} 

당신은 단지 func4 전화

이 필요합니다.

+1

다른 이들의 숙제를하는 방법. 나는 또한 여기에 울타리가있다. 내가 돈을 내면 흰뺨 닦을거야. –

+0

+1 @SamIam –

관련 문제