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