1

私はこれを持っており、forループを使用して問題を繰り返し解決します。再帰を使用するif-elseステートメントを使用して再帰アルゴリズムを使用するようにコードを変換したいと思います。何度か試しましたが、うまく動作しません。

double A;
int B;
double previous=1; 
double answer;

double equation(double A,int B){
 for(int i=1; i<=B; i++){    
  answer= (A*previous)/(i+A*previous);    
  previous = answer;                  
 };
 return answer;                 
}

編集:これが私がこれまでにしたことです:http: //pastebin.com/raw.php?i = kyeq1v5u

4

4 に答える 4

3

公式を持ってください。再帰式です。問題を再帰的に定義します

equation(A, B) =
    IF(B = 1) 
        A/(1+A)  
    ELSE
        (A*equation(B-1)) / (B+A*equation(B-1))  


編集済み:疑似コードに完全なアルゴリズムがあります。あなたがしなければならないのは、cに翻訳することだけです。幸運を。

ヒント: previous等しいequation(A, B-1)

于 2012-07-12T14:44:22.933 に答える
1

再帰的アプローチを考えるとき、最初に、この種の関数の反復的アプローチとは逆の方向に再帰が進行することを念頭に置いて、再帰を終了する条件を考え出します。

あなたの場合、関数のシグネチャはおそらく同じであり、各再帰呼び出しのBは前のラウンドよりも1つ小さくなります。終了条件は、簡単に計算できるものになります。たとえば、B=1です。

また、コードで宣言したグローバル変数は必要ありません。代わりにローカル変数を使用して、再帰関数呼び出しごとにすべてが異なる値を持つことができるようにします。グローバル変数を回避できる場合は、グローバル変数を使用することも悪い習慣です。

于 2012-07-12T14:51:14.770 に答える
1

疑似コード (小さな間違いがあるかもしれませんが、正しい方向に考えられるはずです)

Equation A , B = Equation_internal( A, B , 1, 1)


Equation_internal (A , B , i , prev ) = 
  case i <= B   : return  Equation_internal ( A , B , i+1 , (A* prev )/(i+A*prev) )
  otherwise return prev.
于 2012-07-12T14:49:41.180 に答える
-2

ここに私の小さなコード

double equation(double A,int B);
double equation2(double A,int B, int curcount, double previous);


double A;
int B;
double previous=1; 
double answer;

int main (int argc, const char * argv[])
{


   double toto= equation(5,3);

   double toto2= equation2(5,3,0,1);


    return 0;
}

double equation(double A,int B){
    for(int i=1; i<=B; i++){    
        previous= (A*previous)/(i+A*previous);    
    };
    return previous;                 
}

double equation2(double A,int B, int curcount, double previous){

    if (curcount == B) {
        return previous;
    }else{
        curcount++;
        previous= (A*previous)/(curcount+A*previous); 

        return equation2(A,B,curcount,previous);
    }

}
于 2012-07-12T15:12:56.400 に答える