쉘에서 이 재귀 함수가 왜 잘 작동하는지 알고 싶습니다.
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 ))
함수는 자체적으로 숫자를 인쇄할 것으로 예상합니다. 두 개의 숫자를 인쇄( )하도록 합니다 echo
. result1
두 개의 숫자를 포함하는 어느 시점에서는 result=$(( $result1 * $1 ))
구문상 잘못된 것입니다.