从递归到迭代

时间:2013-12-12 16:25:19

标签: java function recursion iteration

我有递归函数:

public static int fRek(int n) {         
    if (n <= 0)
       return 1;            
    else if (n == 1) 
       return 2;       
    else
       return 3 * fRek(n-2)-3;  
}

问题:如何在迭代中编写它?循环?  我有这个:

public static int fIter(int a) {
    int b = 1 ;
        if (a <= 0) return 1;           
        else if (a == 1) return 2;  
        for (int i = 1; i <= a; i = i+2) {            
              b = b * 3;            
              b = b - 3;        
        }        
        return b;    
    }
}

但它仅适用于偶数:a = 4,6,8,...... 对于奇数,它无法正常工作,我不知道为什么

4 个答案:

答案 0 :(得分:1)

对于偶数,你的第二个算法不起作用,因为在第一段代码中,如果2,函数返回n == 1

else if (n == 1) 
   return 2;     

并且在你的第二个算法中,如果输入参数a是奇数,for循环会最终将它减少到1而不是0,因此使用b=1进行计算是不正确。如果b=2为奇数,则应使用a;如果b=1为偶数,则应使用a

此外,您应该使用i=1的for循环,a为奇数,i=2a,而{{1}}为偶数。

答案 1 :(得分:0)

是循环,虽然在这种情况下不是那么容易,因为函数不是尾递归。

让我们首先将其转换为尾递归函数。为此,我们传递一个参数,说明临时结果必须经历最终函数x => 3*x-3的频率:

public static int fRek1(int n, int count) {
   if (n <= 0) return finalf(1, count);
   else if (n == 1) return finalf(2, count);
   else return fRek(n-2, count+1);
}
public static int fRek(int n) { return fRek1(n, 0); }
public static int finalf(int n, int count) {
    while (count > 0) {
       n = 3*n-3;
       count--;
    }
    return n;
}

现在你可能已经看到了如何将fRek1转换为while循环:只需用一个块替换递归,其中变量n和count得到它们的新值,并将方法体包含在while (true)中。

答案 2 :(得分:0)

你的第二个问题仍然是试图递归地解决这个问题。您需要将您的逻辑分解为While语句。这是一个开始:

int tmp = n
while (tmp > 1) {

Insert main logic here

}
//Base Cases
if (tmp == 1)
    n += 3 

if (tmp <= 0)
    n += 0 //This does nothing but listing for illustration

return n;

答案 3 :(得分:0)

它适用于偶数的原因是因为你在函数开头很难编写相应的停止条件。

看看你的递归函数。如果数字是偶数,则会有n == 0之前的递归调用;也就是说,直到我们到达这里:

if (n <= 0)
   return 1; 

从那里,我们自下而上计算最终结果。

return 3 * 1 -3;  //that's 0 
return 3 * 0 -3;  //that's -3
return 3 * -3 -3; //that's -12
return 3 * 3 -3;  //that's -39
//...and so on

如果数字是奇数,我们从2开始,因为这行:

else if (n == 1) 
   return 2;  

从那里,我们自下而上计算最终结果。

return 3 * 2 -3;  //that's 3 
return 3 * 3 -3;  //that's 6
return 3 * 6 -3;  //that's 15
return 3 * 15 -3;  //that's 42
//... and so on    

你的迭代函数就像这样开始。

int b = 1 ;

也就是说,你强加的条件应该只是在数字是偶数的情况下。相反,你应该测试数字是偶数还是奇数。

if (a % 2 == 0) 
    b = 1;           
else 
    b = 2;  
for (int i = b; i <= a; i = i+2) {    
    //...
}
相关问题