이 확실히 무한 루프 (전문 용어로, take
는 수정되지 않습니다).
나머지 질문에 대답하려면 에 내부 도우미 기능이 필요합니다.
봅니다 스칼라에 다음과 같은 알고리즘을 번역하기 : 목록이 비어
- 경우, 오류 그밖에
- 을 던져 목록은 그렇지
-
의 첫 번째 요소 반환 하나 개의 요소가있는 경우
- (재귀 적으로) 최대 값
m.take(1)
을 계산하려면 max_of_rest
- 큰 것을 반환하십시오.
m(0)
및 max_of_rest
스칼라 재미 학습 재귀 되세요!
ADDENDUM
상기 알고리즘은 정답을 생성하면서, 매우 비효율적으로한다. 고려하십시오 :
maximum([2, 4, 1, 10, 3])
= max(2, maximum([4, 1, 10, 3]))
= max(2, max(4, maximum([1, 10, 3])))
= max(2, max(4, max(1, maximum([10, 3]))))
= max(2, max(4, max(1, max(10, maximum([3])))))
= max(2, max(4, max(1, max(10, 3))))
= max(2, max(4, max(1, 10)))
= max(2, max(4, 10))
= max(2, 10)
= 10
각 호출이 호출 스택에서 "쌓여"많은 추가 메모리를 소비하는 점에 유의하십시오. 이 경우 tail-recursive 공식을 사용하는 것이 훨씬 더 좋습니다. 주스트 덴 보어에 의해 지적
maximum([2, 4, 1, 10, 3])
= _maximum([4, 1, 10, 3], max(4, 2))
= _maximum([1, 10, 3], max(1, 4))
= _maximum([10, 3], max(10, 4))
= _maximum([3], max(3, 10))
= _maximum([], 10)
= 10
지금이 꼬리 재귀 경우에, 당신은 두 번째 기능이 수행
.이 내부 재귀 함수는 외부 함수는 당신이 그것을 운동을 즐길 수 있도록 내가 스칼라 구문을 사용하여 의도적 아니에요 maximum(a) =
if a is empty raise an error
else return _maximum(a.take(1), a(0))
같은 것을 진행이
_maximum(a, v) =
if a is empty return v
else return _maximum(a.take(1), max(a(0), v))
처럼 작동하는지 확인할 수 있습니다. 재미있어!
요소와 current-max를 취하는 로컬 함수를 정의 할 수도 있습니다. 그런 다음 다음 요소와 업데이트 된 current-max를 사용하여 로컬 함수를 다시 호출합니다. – rethab