没有 else 的 if-else 导致递归函数重复

If-else without else causes recursive function to repeat

为什么以下会产生输出 "ayyayy" 而不仅仅是 "ayy"(一次)?

def iftest(b: Boolean): Unit = {
  if(b) iftest(false)
  print("ayy")
}

I 运行 它在 REPL 中作为 iftest(true) 这应该会导致它在第一次通过时失败但在第二次通过时成功(因此只有一次 "ayy")。那么为什么它表现得好像都成功了呢?

scala 中是否有某种我不知道的递归 "backfolding"?

Is there some sort of recursive "backfolding" in scala that I don't know about?

不,该方法按照您定义的方式运行。让我们分析一下:

  1. 您调用 iftest(true) 并调用该方法。
  2. if(b)true,所以你调用 iftest(false) 并开始一个新的堆栈帧。
  3. if(b)现在是false,所以我们不会再次递归调用该方法。
  4. 下一行代码是print("ayy"),所以打印出来,方法完成
  5. 我们回退一帧,我们现在完成调用iftest(false),下一行代码是println("ayy"),所以它再次打印出来
  6. 方法完成。

或许你想要的是:

def iftest(b: Boolean): Unit = {
  if (b) {
    iftest(false)
    print("ayy")
  }
}