LoginSignup
5
4

More than 5 years have passed since last update.

いろんな言語でラムダ式を使ってフィボナッチ数列を表現する

Last updated at Posted at 2017-01-08

とある機会がありまして、いろんな言語でラムダ式を使ってフィボナッチ数列を表現してみました。

javascript編

fib.js
var fib = function(v){
  return(function(f,m){
    return f(f,m)
  }(function(r,n){
    return n < 2 ? n : r(r,n-1)+r(r,n-2)
  },v)
)}

python編

$ python
>>> fib = lambda n: n if n < 2 else fib(n-1) + fib(n-2)
>>> fib(0)
0
>>> fib(1)
1
>>> fib(2)
1
>>> fib(6)
8

ruby編

$ irb
irb(main):001:0> f = lambda { |n| n < 2 ? n : f.call(n-1) + f.call(n-2) }
$ irb(main):002:0> f.call(0)
0
$ irb(main):003:0> f.call(1)
1
$ irb(main):004:0> f.call(2)
1
$ irb(main):005:0> f.call(6)
8

ruby 1.9から、ラムダ関数の書き方が増えたため、次のような書き方もできます(thanks @kbaba1001

[1] pry(main)> f = ->(n) { n < 2 ? n : f[n-1] + f[n-2] }
=> #<Proc:0x007fb5ac26fe58@(pry):1 (lambda)>
[2] pry(main)> f[0]
=> 0
[3] pry(main)> f[1]
=> 1
[4] pry(main)> f[2]
=> 1
[5] pry(main)> f[3]
=> 2
[6] pry(main)> f[6]
=> 8

haskell

$ ghci
Prelude> let fib = 0:1:zipWith (+) fib (tail fib)
Prelude> fib !! 0
0
Prelude> fib !! 1
1
Prelude> fib !! 2
1
Prelude> fib !! 6
8

c++編

ソースコード

fib.cc
#include <iostream>
#include <functional>
using namespace std;

int main(int argc, char const *argv[])
{
  std::function<int(int)> fib = [&fib](const int n)  {
    return n < 2 ? n : fib(n - 1) + fib(n - 2);
  };

  cout << fib(0) << endl;
  cout << fib(1) << endl;
  cout << fib(6) << endl;

  return 0;
}

実行手順

$ g++ -std=c++11 fib.cc 
$ ./a.out 
1
1
8

vim編

vim 8.0にアップデート

$ apt-get install software-properties-common # if not found add-apt-repository command
$ sudo add-apt-repository ppa:jonathon/vim
$ sudo apt-get update
$ sudo apt-get install vim
$ vim --version
$ sudo add-apt-repository -remove ppa:jonathon/vim # delete PPA if needed 

ソースコード

fib.vim
function! Main()
  let Y = {f -> (({x -> f ({y -> x(x)(y)})})({x -> f ({y -> x(x)(y)})}))}
  let Fib = {f -> {n -> (n < 2 ? n : f(n-1) + f(n-2))}}
  echo Y(Fib)(0)
  echo Y(Fib)(1)
  echo Y(Fib)(2)
  echo Y(Fib)(6)

実行手順

$ vim
:source fib.vim
:call Main()

感想

ラムダ式の書き方ひとつとっても、言語によって個性がでるものですね。
個人的には、python、rubyが直感的でした。
Haskell、javascript、c++はなんとか出来ましたが、完全に文法と心を通わせきれていないうちに完成してしまいました。
vimは職場の方におすすめされて書いてみました。一番苦戦しましたが、できたときの感動は大きかったです。

他にも個性的なラムダ式があれば、教えてください :)

5
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4