pythonの再起について
再帰この文を見てもわけがわからない・・・・
def factorial(n, acc=1):
if n == 0:
return acc
else:
return factorial(n-1, acc * n) # 階乗を計算する例
result = factorial(5)
print(result) # Output: 120
再帰に関していえばはっきりよくわからないが、順序良く計算し計算結果を出力してくれる。
昇順、逆順も可能・・・
仕組み的にはわかるが納得できないのはなぜか・・・?
if n == 0:
return acc
でreturnに行きつきそこから決められた順番に動作するという、なんとも不思議な構造をしていることによる。
それは、現在にいながら、過去を改変するというわけのわからない動作に思える・・・、自分だけ・・・?
仮想世界に位置するプロクラムならありなのか~・・・
再帰を納得できないのは、仕方ないとして、なぜか最後まで行きつくと、そこから順番に逆順も可能で動作するというなんとも書いていたら、簡単な理屈なのだが、納得できない。
納得はともかく階乗が必要なときには有効活用できるのかも・・・・?
再帰は自分のような納得しようとする初心者ではつまずく問題のように感じる。
追記
- 累積引数を使う場合: 計算は順次進み、メモリ使用量が抑えられます。各再帰呼び出しは、単に次の計算を行うための呼び出しとなり、結果はアキュムレータに保存されます。
- 累積引数を使わない場合: 各再帰呼び出しが終了するまで計算は行われず、ベースケースに達してからスタックフレームを解消しながら計算が行われます。これはメモリを多く消費する可能性があり、深い再帰呼び出しではスタックオーバーフローのリスクがあります。
累積引数を使う方がfor文と変わらないので直感的にわかりやすい