我有递归函数:
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,...... 对于奇数,它无法正常工作,我不知道为什么
答案 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=2
为a
,而{{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) {
//...
}