シェルの関数再帰

シェルの関数再帰

シェルでこの再帰関数がなぜうまく機能するのかを知りたいです。

exp ( )
    {
        local result
        #local op1="$1"
        #echo $2
        if [[ $2 -eq 0 ]]; then
            echo 1
            return
        fi 
        tmp=$(( $2 - 1 ))
        local result1=$(exp $1 $tmp )
        result=$(( $result1 * $1 ))
        echo $result
    }
    exp 3 4 

ただし、$2を何らかの方法でタッチすると、次のようになります。

exp ( )
    {
        local result
        echo $2
        if [[ $2 -eq 0 ]]; then
            echo 1
            return
        fi 
        tmp=$(( $2 - 1 ))
        local result1=$(exp $1 $tmp )
        result=$(( $result1 * $1 ))
        echo $result
    }
    exp 3 4 

次のように失敗します。

4
foo.sh: line 15: 0
1 * 3 : syntax error in expression (error token is "1 * 3 ")
foo.sh: line 15: 2
3 * 3 : syntax error in expression (error token is "3 * 3 ")
9

答え1

問題はあなたの手ではなく$2あなたのものですecho。あなたが言ったように、あなたの機能は再帰的です。これは、独自の出力を処理することを意味します。単一の戻り番号(予想どおり)以外の項目を印刷するとすぐに競合が発生します。

具体的には、関数は次のことを行います。

    tmp=$(( $2 - 1 ))
    local result1=$(exp $1 $tmp )
    result=$(( $result1 * $1 ))
    echo $result 

exp $1 $tmp(単一数字で保存)の出力がresult1うまく機能します。しかし、他のものをエコーすると、出力はもはや単一の数字ではexpなくなり、実行中の単純な数学が壊れます。

答え2

を呼び出してexp 3 0別の名前で保存したら、意味があるかどうかresult1自分に尋ねてください。$(( $result1 * $1 ))

関数はそれ自体が数字を印刷することを期待しています。 2つの数字を印刷するようにしますechoresult12つの数字を含むある時点では、result=$(( $result1 * $1 ))構文的に間違っています。

関連情報