를 비교하는 이유는이 꼬리 재귀입니다 myList
매우 긴꼬리 재귀 : 이가지 경우
def navigate(myList : List[Int]) : (Int, List[Int]) = {
navigate(0, 0, myList)
}
def navigate(step: Int, offset: Int, myList: List[Int]): (Int, scala.List[Int]) = {
if //some test and exit condition, then a definition of jump
else navigate(step + 1, offset + jump, myList)
}
경우, 첫 번째 경우는 어떤 문제를 제공하지 않습니다, 경우 두 번째 것은 StackOverflowError
입니다.
또한 컴파일러가 재귀가 스택을 증가시키지 않도록 컴파일해야한다고 말하는 방법이 있습니까? 방법에 대한
위해
https://anadea.info/blog/tail-recursion-in-scala가 유용 할 수 있습니다. 그 중 무엇을 얻었는지는'@ tailrec'을 사용하여 주석을 달 수 있으며 컴파일러에서 경고를받습니다 if 최적화되지 않았습니다. – ameer
또한 https://stackoverflow.com/questions/3114142/what-is-the-scala-annotation-to-ensure-a-tail-recursive-function-is-optimized는 다소 자세한 공지가있는 것처럼 보입니다. 최적화되지 않은 이유. – ameer
@ameer 이미 시도했지만 컴파일 오류가 있습니다. "@tailrec '이 주석 처리 된 메서드는 내 경우에는 좋을 수도 있지만 일반적으로 그렇지 않을 수도 있습니다. – marco