2017-10-31 11 views
0

저는 Ocaml에 비교적 익숙하고 Unfold 함수를 올바르게 이해하고 있다고 생각하지만 피보나치 시퀀스를 사용하는 방법을 알 수 없습니다. 우리가 현재 값을 찾을 수 있도록 마지막 두 값의 홀더 변수를 가질 필요가 없을까요? 모든 도움은 대단히 감사하겠습니다. 아래에 Unfold 함수를 추가하여 참조하도록하겠습니다.Ocaml의 Unfold를 사용한 피보나치 시퀀스

let rec unfold (f: 'seed -> ('a * 'seed)) (stop : 'b -> bool) (b :'seed) : 'a list = 
if stop b then [] 
else 
    let x, b' = f b in 
    x :: (unfold f stop b') 

답변

2

다음 두 값을 저장하는 올바른 아이디어가 있습니다. 트릭은 튜플에 저장하는 것입니다.

발전기 함수 튜플을 얻어 생성 된 값으로 제 번호를 리턴하고 튜플의 초 개수와 다음 피보나치 수와 새로운 상태를 생성한다

fun (a, b) -> (a, (b, a+b)) 

정지 기능 만 얻어 튜플을 멈추고 언제 멈출 지 결정한다.

fun (a, b) -> a > 1000 

제 1 상태는 처음 두 피보나치 수열은 (0, 1)이다.

모두 함께 퍼팅 :

# unfold (fun (a, b) -> (a, (b, a+b))) (fun (a, b) -> a > 1000) (0, 1);; 
- : int list = 
[0; 1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987] 
+0

은/Danke을 주셔서 감사합니다! – ohhimark