기능적 프로그래밍을 처음 접했기 때문에 기능적 접근 방식을 사용하여 해결하기가 다소 어려워 보입니다.이전 계산에 대한 정보를 계속 수행하십시오.
1에서 10.000과 같은 숫자 목록이 있고 최대 n까지 합계하는 목록의 항목을 가져 오려고한다고 가정 해 봅니다 (100이라고 가정). 따라서 합계가 100보다 커질 때까지 숫자를 얻을 수 있습니다.
명령형 프로그래밍에서는 각 상호 작용에서 변수를 유지하고 목적이 충족되면 중지 할 수 있기 때문에이 문제를 해결하는 것이 쉽지 않습니다.
그러나 함수 프로그래밍에서 어떻게 동일한 작업을 수행 할 수 있습니까? sum 함수는 완성 된리스트에 대해 연산을 수행하기 때문에 완성 된리스트가 아직 없기 때문에 어떻게 계산을 계속할 수 있습니까?
합 느리게 계산 된 경우, 그 뭔가를 작성할 수
(1 to 10000).sum.takeWhile(_ < 100)
PS : 어떤 대답을 이해할 수 있지만, 나는 이후, 합계 각 시간을 계산하지 않는 일을하고 싶습니다 분명히 명령형은 속도와 관련하여 훨씬 더 최적이 될 것입니다.
편집 :
나는 기능 재귀 함수에 필수적 루프 접근 방식을 "변환"수 있다는 것을 알고. 나는 기존 라이브러리 함수 중 하나가 내가 필요할 때마다 하나를 쓰지 않는 방법을 제공 할 수 있는지 찾는 것에 더 관심이있다.
아마도 변수 누산기를 사용하는 것이 가장 쉽습니다. '{var sum = 0; (1 ~ 10000) takeWhile {i => sum + = i; 합 <100}}'. 여기에'var'을 가지는 것에는 아무런 문제가 없습니다; 표현식에'{}'이 있기 때문에 이스케이프 할 수 없습니다. –
왜 "무언가가 필요할 때마다"함수를 작성하는 것이 당신이 무언가를 필요로 할 때마다 명령형 루프를 작성하는 것보다 자연스러운 것이라고 생각합니까? – Ben