멋진 피보나치 수열 (Elixir)

6938 단어 Elixir

소개


  • Twitter에서 근사하다고 내가 느꼈다 피보나치 수열의 프로그램이 쓰여 있었기 때문에 찍어 보았습니다
  • Fibonacci sequence generated by an @elixirlang stream

  • Elixir은 1.10.4-otp-23을 사용합니다

  • 피보나치 수열


    f(0) = 0 \\
    f(1) = 1 \\
    f(n) = f(n -1) + f(n - 2)
    

    프로그램



    lib/fibonacci.ex
    defmodule Fibonacci do
      def sequence, do: Stream.unfold({0, 1}, fn {a, b} -> {a, {b, a + b}} end)
    
      def at(n), do: sequence() |> Enum.take(n + 1) |> Enum.at(-1)
    end
    
    defmodule PureFibonacci do
      def at(0), do: 0
    
      def at(1), do: 1
    
      def at(n), do: at(n - 1) + at(n - 2)
    end
    
  • Fibonacci 모듈이 트위터에 쓰여진 내가 멋지다고 느낀 프로그램입니다.
  • 조금 바꾸고 있습니다 (뜻은 같아야합니다)

  • PureFibonacci 모듈은 소박한 피보나치 수열 계산을 작성한 예입니다

  • 측정


    $ iex -S mix
    
    iex> :timer.tc(Fibonacci, :at, [40])    
    {19, 102334155}
    
    iex> :timer.tc(PureFibonacci, :at, [40])
    {6503506, 102334155}
    

  • : 치메 r. tc/3은 인수에 (모듈, 메소드 이름의 아톰, 인수)를 지정하여 호출하면 결과를 {時間, 値}의 형태로 얻을 수 있습니다.
  • 시간 단위는 microseconds입니다

  • PureFibonacci.at(40) 는 약 6.5초 걸리는 반면, Fibonacci.at(40) 는 19μ초 로 계산이 끝난 것입니다
  • PureFibonacci 쪽이 수식 그대로 쓰고 있는 내용은 알기 쉽습니다만, 시간은 걸리는 결과가 되었습니다

  • Stream.unfold/2

  • Wrapping Up



  • Stream.unfold/2 (이것은 이것에 국한되지 않습니다.)
  • Enjoy 스트림 !
  • 좋은 웹페이지 즐겨찾기