フィボナッチ数列と、関数の再帰的定義とグローバル変数
おっさんです。
今読んでる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.')