2016-09-14 1 views
3

그래서 현재 사용자가 입력 한 값과 동일한 피보나치를 찾은 프로그램이 있습니다. 6은 5가 될 것입니다 (또는 0으로 시작하는지 여부에 따라 13이됩니다). 개인적으로 나는 0으로 시작하는 시퀀스를 선호합니다.F #에서 사용자 입력 값까지 전체 피보나치 시퀀스를 어떻게 인쇄합니까?

open System 

    let rec fib (n1 : bigint) (n2 : bigint) c = 
     if c = 1 then 
      n2 
     else 
      fib n2 (n1+n2) (c-1);; 

    let GetFib n = 
     (fib 1I 1I n);; 

    let input = Console.ReadLine() 
    Console.WriteLine(GetFib (Int32.Parse input)) 

문제는 모든 시퀀스에서 동등한 번호를 찾는 것입니다. 사용자가 입력 한 값까지 모든 값을 인쇄하도록하려고합니다. 6은 0,1,1,2,3,5를 출력합니다. 누구든지 전체 시퀀스를 인쇄하는 방법을 알아 내면 도움이 될 것입니다. 또한 누구든지 내 코드를보고 전체 시퀀스를 인쇄 할 때 0에서 시작하는 방법을 알려 주면 대단히 감사하게 될 것입니다.

도움을 주셔서 감사합니다.

+1

먼저 생성해야하는 것을 인쇄하기 전에 [Infinite Fibonacci Sequence] (http://stackoverflow.com/questions/22914448/infinite-fibonacci-sequence) 및 기타 정보를 살펴보십시오. – s952163

+0

[Rosetta Code] (http://www.rosettacode.org/wiki/Fibonacci_sequence#F.23)를 참조하십시오. 예를 들어 언어에 대해 더 많은 것을 배우기에 좋은 사이트입니다. 특히 익숙한 다른 언어의 솔루션과 비교해 볼 수 있습니다. – TheQuickBrownFox

답변

2

s952163이 Seq 표현식을 사용하여 fibonnaci 시퀀스를 생성하는 방법을 보여주는 링크를 살펴보고 이것이 유용한 이유를 설명합니다.

다음은 지정된 시퀀스 번호까지 시퀀스를 출력 할 것이다 :

let fibsTo n = Seq.unfold (fun (m,n) -> Some (m, (n,n+m))) (0I,1I) 
       |>Seq.takeWhile (fun x -> x <= n) 

let input = Console.ReadLine() 

(fibsTo (Numerics.BigInteger.Parse input))|>Seq.iter(printfn "%A") 

참고 아니라 console.writeline보다는 printfn의 사용, 전자가 더 관용적이다.

또한 부정 입력을 처리하는 것이 오류를 발생시킬 수 있으므로 여기에서 고려할 수 있습니다.

+2

'Seq.take (n)'은 아마도'Seq.takeWhile (fun x -> x <= n)'이어야합니다; OP는 "모든 피보나치 숫자를 특정 숫자까지"요구하고있었습니다. 그는 시퀀스의 첫 번째 'n'숫자를 원하지 않고 지정된 컷오프 수와 같거나 작은 모든 숫자를 원합니다. – rmunn

+0

좋은 지적. 나는 OP가 무엇을 요구하고 있는지 잘못 해석했다. (우연히도 6의 입력 값 또한 시퀀스의 처음 6 요소를 리턴해야한다.) – Pash101

관련 문제