나는 M. Odersky에 의해 스칼라에서 프로그래밍을 읽고 있어요 그는왜 함수 꼬리가 재귀 적이 지 않습니까?
Functions like approximate, which call themselves as their last action, are called tail recursive.
그래서, 나는이 시도 말한다 :
object Main extends App {
implicit val mc = new MyClass(8)
val ti = new TestImplct
ti.test
}
class TestImplct {
def test(implicit mc : MyClass): Unit = {
println(mc.i)
mc.i -= 1
if(mc.i < 0){
throw new IllegalArgumentException
}
test
}
}
class MyClass(var i : Int)
을하지만, 다음과 같은 스택 추적을 생성
Exception in thread "main" java.lang.IllegalArgumentException
at TestImplct.test(Main.scala:13)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
즉, ge 각 재귀 호출에 대해 새 스택 프레임을 지정합니다. 하지만 마지막 행동은 스스로를 호출하는 것입니다. 무엇이 잘못되었으며 꼬리 재귀 적으로 만드는가?
컴파일러가 꼬리 - 호출 최적화를 수행하지 않는 이유는 무엇입니까?
범위에 내재 된 MyClass 인스턴스가 있습니까? – Samar
@Samar 예, 있습니다. 데모보기 – stella
클래스를 정의했습니다. 하지만 당신이 그것을 어디에서 보았는지는 알 수 없습니다. – Samar