40のおっさんのPython学習記録

20年以上前、学部の必修のC言語が全く理解できずに同級生に放り投げ、その後コーディングから遠ざかったガチ文系のおっさんが、ふと思い立ってPythonに挑戦しています。

フィボナッチ数列と、関数の再帰的定義とグローバル変数

おっさんです。

今読んでるMITの教科書は基本書なので新しく学ぶことはそれほど多くはないだろうから練習問題をとこうと思っていたのですが、関数の再帰的定義はこれまで読んだ3冊の入門書にはなかったアイデアでした。例えば下のフィボナッチ数列を計算するコードでfib(n)=fib(n-1)+fib(n-2)と再起定義するだけでいいってのは、へー、こんなので動くんだ、と素直に驚き。ただ、ぐぐると、フィボナッチ数列再帰で計算するのは非常に効率が悪いので、他のアルゴリズムを使ったほうがいいみたい。

def fib(n):
    """Assumes n int >= 0
    Returns Fibonacci of n"""
    if n == 0 or n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

def testFib(n):
    for i in range(n+1):
        print('fib of', i, '=', fib(i))

それとスコープとローカル、グローバル変数の話で、関数の内側のスコープの変数でもglobalを置くことでグローバル変数になり、他の関数の内側からでも参照できるってのは新たな発見でした。

def fib(x):
    """Assumes x an int >= 0
       Returns Fibonacci of x"""
    global numFibCalls
    numFibCalls += 1
    if x == 0 or x == 1:
        return 1
    else:
        return fib(x-1) + fib(x-2)

def testFib(n):
    for i in range(n+1):
        global numFibCalls
        numFibCalls = 0
        print('fib of', i, '=', fib(i))
        print('fib called', numFibCalls, 'times.')