假如说有代码如下:请问还能将递归改为循环吗 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; }
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; }
dd112389
2021-04-02 01:48:22 +08:00
这是想算累加 ? 那直接一个循环不就出来了 ? var n = 10; var sum = 0; for (let i = 0; i <= 10; i++) sum += i;
thedrwu
2021-04-02 01:57:28 +08:00
自己维护个栈,再 goto 大法
irytu
2021-04-02 02:03:37 +08:00
说到这个有点意思的,想问个一样的问题:
bool reachingPoints(int sx, int sy, int tx, int ty) { if (sx == tx && sy == ty) return true; int sx1 = sx + sy; int sy1 = sy;
就不能缩进一下么 ```Java 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; } ```
@dd112389 显然不是…… 排除副作用的话 add :: Int -> Int add 1 = 1 add n = n + 3 * add n 这是一个指数增长的函数。
@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 但如何保证这个不变式正确似乎比较诡异。