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

伪代码(可能有一些小错误,但它应该让你朝着正确的方向思考

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 回答
1

在考虑递归方法时,首先要提出结束递归的条件,记住在这种函数中,递归通常与迭代方法相反。

在您的情况下,函数签名可能是相同的,并且每个递归调用的 B 都比前一轮小。结束条件将是您可以轻松计算的东西,例如 B=1。

此外,您不需要在代码中声明的任何全局变量。改为使用局部变量,以便它们在每个递归函数调用中都可以具有不同的值。当您可以避免使用全局变量时,使用它们也是一个坏习惯。

于 2012-07-12T14:51:14.770 回答
-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 回答