TAKEO

TAKEO

クロージャーの実装例 Python Javascript Go

本記事ではクロージャーの実装例を紹介します。

実装するもの

クロージャーの実装例としてフィボナッチ数列をとりあげます。フィボナッチ数列とは次のような数列で、

Copied!!
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946

第0項を0、第1項を1としたときに、以降の項が前の2つの項の和となる数列のことです。

Python

Pythonでクロージャーを実装する時のポイントは次の点です

  • nonlocalを使用すること。使用しなければ変数ab関数calcのローカル変数と認識されてしまいます。

    Copied!!
    UnboundLocalError: local variable 'a' referenced before assignment
    
fibonacci.py
Copied!!
def fibonacci():
    a = 0
    b = 1

    def calc():
        nonlocal a, b
        ret = a + b
        a = b
        b = ret
        return ret

    return calc


f = fibonacci()
for _ in range(20):
    print(f())

Javascript

  • 変数のスコープがpythonより直感的でいいですね。
fibonacci.js
Copied!!
fibonacci = () => {
  var a = 0;
  var b = 1;

  calc = () => {
    ret = a + b;
    a = b;
    b = ret;
    return ret;
  };
  return calc;
};

f = fibonacci();
for (let step = 0; step < 20; step++) {
  console.log(f());
}

Go

fibonacci.go
Copied!!
package main

import "fmt"

func fibonacci() func() int {
    a := 0
    b := 1
    return func() int {
        ret := a + b
        a = b
        b = ret
        return ret
    }
}

func main(){
    f := fibonacci()
    for i:=0; i<20; i++{
        fmt.Println(f())
    }
}