Python 3.x 學習 —— 遞迴函式
阿新 • • 發佈:2019-02-03
計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位。
解決遞迴呼叫棧溢位的方法是通過尾遞迴優化。
尾遞迴是指,在函式返回的時候,呼叫自身本身,並且,return語句不能包含表示式。這樣,編譯器或者直譯器就可以把尾遞迴做優化,使遞迴本身無論呼叫多少次,都只佔用一個棧幀,不會出現棧溢位的情況。
遺憾的是,大多數程式語言沒有針對尾遞迴做優化,Python直譯器也沒有做優化
漢諾塔問題:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 利用遞迴函式計算階乘
# N! = 1 * 2 * 3 * ... * N
def fact(n):
if n == 1:
return 1
return n * fact(n-1)
print('fact(1) =', fact(1))
print('fact(5) =', fact(5))
print('fact(10) =', fact(10))
# 利用遞迴函式移動漢諾塔:
def move(n, a, b, c):
if n == 1:
print('move', a, '-->', c)
return
move(n-1, a, c, b)
print('move', a, '-->', c)
move(n-1, b, a, c)
move(4, 'A', 'B', 'C')