函式遞迴
- 區域性函式變數的特性自成體系,作為呼叫函式自身
- 遞迴函式不依靠任何外部資源,自成體系的迭代到基準值
return:返回特定的退出狀態碼,在函式結束時
#! /bin/bash
# using recursion
# 計算階乘,formula:x!=x*(x-1)!, 使用遞迴函式得到(x-1)!
function factorial {
# 遞迴邊界,根據1的階乘是1
if [ $1 -eq 1 ]; then
echo 1
else
local temp=$[ $1 -1 ]
# 接收函式的輸出,並將返回值傳遞給result
local result=$(factorial $temp)
echo $[ $result * $1 ]
fi
}
read -p "Enter value: " value
# result與自成體系的遞迴函式不同
result=$(factorial $value)
echo "The factorial of $value is : $result"
理解最佳化
- 當到達遞迴邊界後,函式return最底層被呼叫並開始回溯
- 遞迴函式的return(回溯)順序和呼叫順序剛好相反!
那是因為上一層執行遞迴之後的程式碼會呼叫下一層返回的值
亦或者說:最底層的實現(return1)作為最外層的呼叫(return4),如此迴圈往復
例如,計算 factorial 4 的過程如下:
-
factorial 4
呼叫factorial 3
,返回3 * factorial 3
。 -
factorial 3
呼叫factorial 2
,返回2 * factorial 2
。 -
factorial 2
呼叫factorial 1
,返回1 * factorial 1
。 -
factorial 1
返回1
。
逐層返回時: -
factorial 2
返回2 * 1 = 2
。 -
factorial 3
返回3 * 2 = 6
。 -
factorial 4
返回4 * 6 = 24
。 -
當遞迴停止後,函式內部的result返回的是之後的階乘,因為每一層遞迴都會將當前的 result 乘以當前的 $1,直到最外層呼叫。