if-else without else会导致递归函数重复

use*_*764 1 conditional if-statement scala

为什么以下产生输出"ayyayy"而不仅仅是"ayy"(曾经)?

def iftest(b: Boolean): Unit = {
  if(b) iftest(false)
  print("ayy")
}
Run Code Online (Sandbox Code Playgroud)

我在REPL中运行它iftest(true)应该导致它在第一次传递时失败但在第二次传递时失败(因此只有一个"ayy").那为什么它既成功又成功呢?

在scala中是否存在某些我不知道的递归"后退"?

Yuv*_*kov 8

在scala中是否存在某些我不知道的递归"后退"?

不,该方法按照您的定义运行.让我们分析:

  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")
  }
}
Run Code Online (Sandbox Code Playgroud)