くーぱぱのエンジニア作業ログ

一児の父で、エンジニアの、日々の作業記録です

STEP1-5 演習7 解説 part2

初心者が躓きそうなところ

下記記事で紹介した演習サイトは非常に良いです。

STEP1-2 pythonの構文を調べる - くーぱぱのエンジニア作業ログ

ただし学生さん以外は答えを知りません。

あってるか確認する方法も、解決するためのサンプルコードもないため、挫折したときに手の打ちようがないですね。

ということで、躓きそうなこの章は、解説しながら解いていきたいと思います。

演習7-2

問:

def fibonacci(n):
    if n == 0 :
        return 1
    elif n == 1 :
        return 1
    else :
        return fibonacci(n - 1) + fibonacci(n - 2)

n = int(input('please input real num n ='))
print(fibonacci(n))

解説

再帰関数については、こちらの記事で解説しています。 STEP1-4 演習7 解説 part1 - くーぱぱのエンジニア作業ログ

ここでも同様に問題を読み替えてみましょう。

n番目の数字は、n - 1番目の数字と、n - 2番目の数字を足した値だ!

プログラムチックに読み替えるとこんな感じですね。

fibonacci(n) = fibonacci(n - 1) + fibonacci(n - 2)

終了条件は、下記のとおりですね。

nが1のときは1だ!
nが0のときも1だ!

ということで、フィボナッチ数列の関数は出来上がりです。

終了条件は1つとは限りません。

あくまで、自分自身を呼び出さない条件と解釈すると、スムーズに理解できると思います。たぶん。

また、フィボナッチ数列の問題を再帰関数を使わずに解くとこのようになります。

def fibonacci(n):
    num1 = 1
    num2 = 1
    res = 1
    
    for i in range(0, n - 2):
        #フィボナッチ数列の計算
        res = num1 + num2
        #次の計算では、num1は現在のnum2になる
        num1 = num2
        #次の計算では、num2は現在のresになる
        num2 = res
    return res
            
n = int(input('please input real num n ='))
print(fibonacci(n))

実装できますが、ロジックの正しさが直感的には理解しづらいですね。

なんで次の計算のことを今考えないといけないの?!ってなっちゃいます。

こういったロジックのややこしさが、不具合の原因になりやすいです。

関数や、オブジェクト指向などの手法は、一つ一つの役割を小さく簡単なものに細分化することで、解決すべき問題をわかりやすいものに落とし込むことにあると思います。

もし、現在取り組んでいる問題が複雑だな、と感じることがあれば、本当に細分化ができているのか?を見つめ直してもいいかもしれませんね。

以上、くーぱぱでした。