如何将迭代算法转换为递归解法

时间:2012-07-12 14:30:18

标签: c recursion for-loop

我有这个使用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 个答案:

答案 0 :(得分:3)

有一个公式。这是一个递归公式。它以递归方式定义您的问题

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


已编辑:psudo-code中有完整的算法。你所要做的就是翻译成c。祝好运。

提示:previous等于equation(A, B-1)

答案 1 :(得分: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.

答案 2 :(得分:1)

在考虑递归方法时,首先提出结束递归的条件,记住通常递归在相反的方向上进行,而不是迭代方法在这种函数中。

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

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

答案 3 :(得分:-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);
    }

}