とある機会がありまして、いろんな言語でラムダ式を使ってフィボナッチ数列を表現してみました。
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は職場の方におすすめされて書いてみました。一番苦戦しましたが、できたときの感動は大きかったです。
他にも個性的なラムダ式があれば、教えてください :)