Skip to content

Instantly share code, notes, and snippets.

@suzuken

suzuken/1.md Secret

Created August 2, 2016 05:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save suzuken/a8ec8fc95cd0c0d18d8d5584fdd4f3ab to your computer and use it in GitHub Desktop.
Save suzuken/a8ec8fc95cd0c0d18d8d5584fdd4f3ab to your computer and use it in GitHub Desktop.

課題1 手続きの基礎

n番目のフィボナッチ数を返す手続き fib を実装してください。以下は実装のスタブです。

// fib.go
package main

func fib(n int) int {
	// ...
}

func main() {
}

例えば以下のように利用できることとします。

> fib(0)
0
> fib(1)
1
> fib(10)
55

整数以外の値や負の値が与えられた場合については適宜考えて処理するようにしてください。


発展課題その1

上記の手続き fib に対するユニットテストを書いてください。

// fib_test.go
package main

import (
	"testing"
)

func TestFib(t *testing.T) {
	// ...
}

上記のテストが go test -v をパスすることを確かめましょう。


発展課題その2

実装した fib をコマンドラインアプリケーションとして便利につかえるようにしましょう。以下のようにして実行できるようにしてみてください。

$ go run fib.go 10
55

あるいは以下のようにしてもよいでしょう。

$ go build fib.go
$ ./fib 10
55

結果は標準出力に出すものとします。

  • コマンドライン引数を取るには os.Args を使うと良いでしょう。
  • string から int の変換には strconv を使います。
  • 標準出力は fmt.Fprint(os.Stdout, ...) などを使うと良いでしょう。

おおまかには以下のような形式になるでしょう。

package main

import (
	"fmt"
	"os"
	"strconv"
)

func fib(n int) int {
	// ...
}

func main() {
	if len(os.Args) < 2 {
		fmt.Fprint(os.Stderr, "do nothing\n")
		os.Exit(1)
	}
	// ...
}

余談

  • q1 ディレクトリなんだから package q1 になるんじゃないのと思ったあなた、それでもいいです。そのかわり発展課題その2ではコマンドラインアプリケーションにするので、適当にディレクトリつくって main パッケージも作る必要があります。実際には package q1 ないし package math とかをつくるほうが現実的ではあります。
  • この課題はGoでコマンドラインアプリケーションを書くことのチュートリアルでもあります。需要がありそうだったらもうちょっと講義でもふれるかもしれません。Goでコマンドラインアプリケーション書いたりバッチ書くのおすすめです。
  • ちなみにこの課題の目的はローカルでGoの実行環境がちゃんとつくれているか、コーディング環境がちゃんと整っているかをみています。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment