1. 程式人生 > >Python 3.x 學習 —— 遞迴函式

Python 3.x 學習 —— 遞迴函式

計算機中,函式呼叫是通過棧(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')