1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Goで再帰クロージャを実装

Last updated at Posted at 2020-10-21

はじめに

Go言語の勉強version2ということで、アルゴリズムの勉強をGoでやってみたというものです。

再帰クロージャ

まず、クロージャとはなのですが、下記に参考にした文を記載致します。

Goの無名関数は「クロージャ」です。クロージャは日本語では「関数閉包」と呼ばれ、関数と関数の処理に関係する「関数外」の環境をセットにして「閉じ込めた(閉包)」ものです。

ということで、無名関数を表しています。今回はこれを使用し再帰関数を作成してみることから始めました。

  1. 下記に階乗を計算する関数[func fact (n int) int]を作成してみました。
fact.go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	r := bufio.NewReader(os.Stdin)
	w := bufio.NewWriter(os.Stdout)
	defer w.Flush()

	var a int

	fmt.Fscan(r, &a)

	result := solveFact(a)
	fmt.Print(result)
}

func solveFact(x int) int {
	var fact func(n int) int
	 fact = func(n int) int{
		if n == 0{ return 1 }
		return n * fact(n - 1)
	}
	return fact(x)
}

実行結果

❯ go run fact.go
4
24
  1. フィボナッチ数列を計算する関数[func fib (n int) int]を作成してみました。
fib.go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	r := bufio.NewReader(os.Stdin)
	w := bufio.NewWriter(os.Stdout)
	defer w.Flush()

	var a int

	fmt.Fscan(r, &a)

	result := solveFib(a)
	fmt.Print(result)
}

func solveFib(x int) int {
	var fib func(n int) int
	fib = func(n int) int{
		if n <= 1{return n}
		return fib(n -1) + fib(n - 2)
	}
	return fib(x)
}

実行結果

❯ go run fib.go
10
55

まとめ

入出力には、fmt.Scan()/fmt.Printf()を使用しています。ただ、入出力量が怖いので、bufioを使用し、バッファリングするようにしています。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?