根据一切递归可以转为循环,问个递归中嵌套循环的问题
public int add(int n) {
int k = n;
for (int i = 0; i< 3; i++) {
if (n != 1) {
k += add(n – 1);
System.out.println(k);
} else {
k+=0;
System.out.println(k);
}
}
return k;
}
bool reachingPoints(int sx, int sy, int tx, int ty) {
if (sx == tx && sy == ty) return true;
int sx1 = sx + sy;
int sy1 = sy;
int sx2 = sx;
int sy2 = sx + sy;
if ((sx1 > tx || sy1 > ty) && (sx2 > tx || sy2 > ty))
{
return false;
}
return reachingPoints(sx1, sy1, tx, ty) || reachingPoints(sx2, sy2, tx, ty);
}
这个递归怎么变循环?
@punk2sang 如果你要保留所有副作用的话就必须自己维护栈帧了。
不保留副作用的话一方面看下 DP,其实只需要保留 last k
last = nil
loop(nn in 1…n){
k=n
loop(i in 0..3){
if(nn != 1){
k += last
println(k)
} else {
k+=0
print(k)
}
last = k
}
虽然上述似乎无法正确地被形式化证明。
虽然在 nn != 1 前可以添加不变式 nn != 1 => last != nil 但如何保证这个不变式正确似乎比较诡异。
add :: (Int, [Char]) -> (Int, [Char])
add (1, s) = (1, “1n1n1”)
add (n, s) = (n + 3 * add n, concat $ replicate 3 $ s ++ show k)
这种简单递归根本不用我说了吧
public static boolean reachingPoints(int sx, int sy, int tx, int ty) {
if (sx == tx && sy == ty) {
return true;
} else {
int sx1 = sx + sy;
int sy2 = sx + sy;
if ((sx1 > tx || sy > ty) && (sx > tx || sy2 > ty)) {
return false;
} else {
return reachingPoints(sx1, sy, tx, ty) || reachingPoints(sx, sy2, tx, ty);
}
}
}
不过这代码看起来头疼,结合业务逻辑的目的来看可能还好…