没有 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?
不,该方法按照您定义的方式运行。让我们分析一下:
- 您调用
iftest(true)
并调用该方法。
if(b)
是 true
,所以你调用 iftest(false)
并开始一个新的堆栈帧。
if(b)
现在是false
,所以我们不会再次递归调用该方法。
- 下一行代码是
print("ayy")
,所以打印出来,方法完成
- 我们回退一帧,我们现在完成调用
iftest(false)
,下一行代码是println("ayy")
,所以它再次打印出来
- 方法完成。
或许你想要的是:
def iftest(b: Boolean): Unit = {
if (b) {
iftest(false)
print("ayy")
}
}
为什么以下会产生输出 "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?
不,该方法按照您定义的方式运行。让我们分析一下:
- 您调用
iftest(true)
并调用该方法。 if(b)
是true
,所以你调用iftest(false)
并开始一个新的堆栈帧。if(b)
现在是false
,所以我们不会再次递归调用该方法。- 下一行代码是
print("ayy")
,所以打印出来,方法完成 - 我们回退一帧,我们现在完成调用
iftest(false)
,下一行代码是println("ayy")
,所以它再次打印出来 - 方法完成。
或许你想要的是:
def iftest(b: Boolean): Unit = {
if (b) {
iftest(false)
print("ayy")
}
}