주어진 배열의 연속 하위 배열에서 최대 합계를 제공하는 스칼라 코드를 작성하려고합니다. 예 : val arr= Array(-2, -3, 4, -1, -2, 1, 5, -3)
. 이 배열에서 최대 연속 하위 배열 합계, 즉 4 + (-1) + (-2) + (1) +5 = 7을 얻어야합니다.이 결과를 얻기 위해 다음 코드를 작성했습니다.
scala> arr.foldLeft(0) { (currsum,newnum) => if((currsum+newnum)<0) 0 else { if(currsum<(currsum+newnum)) (currsum+newnum) else currsum }}
res5: Int = 10
그러나 maximum_so_far
계산 / 합산이 진행됨에 따라 값 을 업데이트 할 수 없으므로 실제 결과에서 벗어났습니다 . foldLeft
이 기능 을 사용 maximum_so_far
했으므로 인접한 하위 배열 요소의 합계가 이전 max_sum보다 큰 경우에만 변수 를 업데이트 할 수 있습니까?
이 계산을 위해 입력 데이터를 따라 두 개의 값을 전파해야합니다. 명령형 경우에서해야하는 것처럼 :
arr.foldLeft((0,0)){
case ((maxSum, curSum), value) => {
val newSum = Math.max(0, curSum + value)
(Math.max(maxSum, newSum), newSum)
}
}._1
다른 방법은 중간 결과 (원하는 경우 느리게)를 계산 한 다음 최대 값을 선택하는 것입니다.
arr.toIterator.scanLeft(0){
case (curSum, value) =>
Math.max(0, curSum + value)
}.max
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다