遞迴中Return例項分析

NAGISB發表於2024-10-08

函式遞迴

  • 區域性函式變數的特性自成體系,作為呼叫函式自身
  • 遞迴函式不依靠任何外部資源,自成體系的迭代到基準值

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,直到最外層呼叫。

相關文章