다른 포스터는 좋은 답변을 받았고 이미 말한 내용을 반복하지 않겠습니다. 질문에 Scala 예제를 제공 했으므로 Scala 특정 예제를 제공하겠습니다. 으로 트릭은 이미 말했다하는 foldRight
요구 보존 n-1
스택 프레임을,n
목록의 길이를이 쉽게 스택 오버 플로우가 발생할 수 있습니다 - 그리고 심지어 꼬리 재귀이 당신을 절약 할 수있다.
A List(1,2,3).foldRight(0)(_ + _)
는 다음과 같이 축소됩니다.
1 + List(2,3).foldRight(0)(_ + _) // first stack frame
2 + List(3).foldRight(0)(_ + _) // second stack frame
3 + 0 // third stack frame
// (I don't remember if the JVM allocates space
// on the stack for the third frame as well)
다음으로 List(1,2,3).foldLeft(0)(_ + _)
축소됩니다.
(((0 + 1) + 2) + 3)
이루어 같이 반복적으로 계산 될 수있는 구현List
.
Scala로 엄격하게 평가되는 언어에서 a foldRight
는 큰 목록의 스택을 쉽게 날려 버릴 수 있지만foldLeft
그렇지 않습니다.
예:
scala> List.range(1, 10000).foldLeft(0)(_ + _)
res1: Int = 49995000
scala> List.range(1, 10000).foldRight(0)(_ + _)
java.lang.StackOverflowError
at scala.List.foldRight(List.scala:1081)
at scala.List.foldRight(List.scala:1081)
at scala.List.foldRight(List.scala:1081)
at scala.List.foldRight(List.scala:1081)
at scala.List.foldRight(List.scala:1081)
at scala.List.foldRight(List.scala:1081)
at scala.List.foldRight(List.scala:1081)
at scala.List.foldRight(List.scala:1081)
at scala.List.foldRig...
따라서 내 경험 법칙은 특정 연관성이없는 연산자의 경우 항상 foldLeft
최소한 Scala에서를 사용하는 것 입니다. 그렇지 않으면 답변에 제공된 다른 조언을 따르십시오.).