2010-08-03 4 views
3
fact() 
{ 
    if [ $1 -eq 1 ] 
    then 
     return 1 
    else 
     y=`expr $1 - 1` 
     fact $y 
     b=$(($1 * $?)) 
     return $b 
    fi 
} 
echo "enter" 
read n 
fact $n 
echo "$?" 

숫자의 계승을 찾는 프로그램입니다. 출력은 최대 5입니다. 6의 출력은 208로 표시되지만 정답은 720입니다.이 오류의 원인은 무엇입니까?왜 내 bash 함수가 잘못된 값을 반환합니까?

+0

가능한 중복의 계승을 계산보고 싶어요 [Bash 스크립트에서 숫자의 계승을 어떻게 찾을 수 있습니까?] (http://stackoverflow.com/questions/3394580/how-do-you-find-the-factorial-of-a-number-in- a-bash-script) –

답변

7

기능의 반환 값은 255까지 갈 수있다 :

a() 
{ 
     return 255 
} 

a 
echo $? 

b() 
{ 
     return 256 
} 

b 
echo $? 

는 생산 :

$ bash x.sh 
255 
0 

returnexitexit 같은 255 (http://www.unix.org/whitepapers/shdiffs.html)까지의 값을 가질 수있다.

한 가지 대안은 다른 대답에 설명 된대로 반복 제안으로 전환하는 것입니다. 은 다른 방법은 에코 사용하고 재귀 출력 그런 식으로 캡처 할 수 있습니다 : 예상 대시를 사용하는 것과

#!/bin/bash 

fact() 
{ 
    if [ $1 -eq 1 ] 
    then 
     echo 1 
    else 
     y=$(expr $1 - 1) 
     f=$(fact $y) 
     b=$(($1 * $f)) 
     echo $b 
    fi 
} 
echo "enter" 
read n 
fact $n 
1

흥미롭게도, 프로그램 작동, 그것은 단지 떠들썩한 파티를 사용하여 실패합니다. 그래서 이것은 bashism 인 것처럼 보입니다.

그냥 라인 프로그램의 상단에

#!/bin/dash 

를 추가하고 그것을 작동합니다!

+0

호기심에 +1. 그래도 조금 더 큰 숫자로 다시 깨질 것으로 기대됩니다. – tripleee

2

bourne shell cant store는 $로 많이 저장됩니까? (종료 코드). 제한을 heres

n=0 
on=0 
fact=1 

echo -n "Enter number to find factorial : " 
read n 

on=$n 

while [ $n -ge 1 ] 
do 
    fact=`expr $fact \* $n` 
    n=`expr $n - 1` 
done 

echo "Factorial for $on is $fact" 
1

배시 스크립트 배시 함수 값들이 복귀 할 수있는 값을 반환 코드, 이에 한정되는 것으로 의도된다 돌아가 다른 방법 (255)이다. 127보다 큰 값 (일반적으로 127보다 큰 값 - 최대 255까지의 값 - 수신 된 신호를 나타내는 데 사용됨)에 의존해서는 안됩니다.

의 선

fact $y 
b=$(($1 * $?)) 

$? fact의 반환 코드를 사용할 것으로 예상하고,이 코드는 다음 255

값을 반환 배쉬 방법을 인쇄하는 주장 할 수 없으며, 구문 분석 또는 이 결과를 평가합니다.

2

당신이보고있는 것은 256에 함수 반환 값의 둘러보기입니다. 720 mod 256208 (256 + 256 + 208 = 720)입니다. 이것은 오히려 반환 코드보다 값을 반환하는 표준 출력을 사용

#!/bin/bash 
fact() 
{ 
    if [ "$1" -eq "1" ] 
    then 
     echo 1 
     return 
    fi 
    y=`expr $1 - 1` 
    z=$(fact $y) 
    echo $(($1 * $z)) 
} 
echo "enter" 
read n 
echo "$(fact $n)" 

: 당신이 쉘 기능을 사용해야하는 경우

내 조언은,하는 것입니다.

또는 더 나은, 작업의 바로 도구를 사용

pax> echo 'define f(x) {if (x>1){return x*f(x-1)};return 1} 
      f(6)' | bc 
720 
pax> echo 'define f(x) {if (x>1){return x*f(x-1)};return 1} 
      f(500)' | BC_LINE_LENGTH=99999 bc 
12201368259911100687
45373153881997605496447502203281863013616477148203584163378722078177 
20048078520515932928547790757193933060377296085908627042917454788242 
49127263443056701732707694610628023104526442188787894657547771498634 
94367781037644274033827365397471386477878495438489595537537990423241 
06127132698432774571554630997720278101456108118837370953101635632443 
29870295638966289116589747695720879269288712817800702651745077684107 
19624390394322536422605234945850129918571501248706961568141625359056 
69342381300885624924689156412677565448188650659384795177536089400574 
52389403357984763639449053130623237490664450488246650759467358620746 
37925184200459369692981022263971952597190945217823331756934581508552 
33282076282002340262690789834245171200620771464097945611612762914595 
12372299133401695523638509428855920187274337951730145863575708283557 
80158735432768888680120399882384702151467605445407663535984174430480 
12893831389688163948746965881750450692636533817505547812864000000000 
00000000000000000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000 

나는 bash를 전용 솔루션은 500 :-)

관련 문제