2013-08-20 1 views
2

나는 간단한 비 피보나치 시퀀스 생성기를 작성 중이며 명령 행 인수를 사용하여 범위를 지정했다. 이미 Non_Recursive 버전을 구현했으며 예상대로 작동합니다. 지금리눅스 셸 스크립트와 재귀, 값을 유지하지 않는 변수

clear 
if [ $# -ne 1 ]; then 
    echo "Invalid Argument." 
    exit 
fi 

max=$1 

a=0 
b=1 
echo "Non-Fibonacci Numbers :" 
lastFib=0 
flag=0 
for ((i=1; i<=i+1; i++)) 
do 
    if [ $flag -eq 1 ] 
    then 
    break 
    fi 
    let c=$a+$b 
    if [ $(($c-$lastFib)) -gt 1 ] 
    then 
    for ((j=lastFib+1; j<c; j++)) 
    do 
     if [ $j -gt $max ] 
     then 
     flag=1 
     break 
     fi 
     echo -ne $j", " 
    done 
    fi 
    a=$b 
    b=$c 
    let lastFib=$c 
done 
echo -e "\n" 

나는 앞으로 가서 재귀 적 접근 방식을 사용하여 동일한 로직을 구현 : 여기에

은 비 재귀 버전의 코드입니다.

clear 

nonfib() 
{ 
    let c=$a+$b 
    if [ $(($c-$lastFib)) -gt 1 ] 
    then 
    for ((i=lastFib+1; i<c; i++)) 
    do 
     if [ $i -gt $limit ] 
     then 
     flag=1 
     break 
     fi 
     echo -ne $i" " 
    done 
    fi 
    a=$b 
    b=$c 
    lastfib=$c 
    if [ $flag -eq 1 ] 
    then 
    exit 
    fi 
    nonfib 
} 

if [ $# -ne 1 ] 
then 
    echo "Invalid Argument!!" 
    exit 
fi 
a=0 
b=1 
flag=0 
lastFib=0 
c=0 
limit=$1 
echo "Non-Fibonacci Numbers : " 
nonfib 
echo -e"\n" 

그러나 여기,

if [ $(($c-$lastFib)) -gt 1 ] 

는 내가 뭘 기대하지 못하는이 라인 :

다음은 Recusive 구현입니다. 현재 피보나치 수와 마지막으로 생성 된 수 사이의 차이가 있는지 확인합니다. 그 사이에 값이 있으면 봅니다. 그러나 이것이 실행이 잘못되어가는 부분입니다.

도움이 필요하십니까? 무엇이 잘못된 것인지 확인 sh -x NonFibRecursive.sh 10 :

편집

내가 좋아하는 코드를 실행. 여기

는 출력 :

Non-Fibonacci Numbers : 
1 1 2 1 2 3 4 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 9 10 [[email protected] ShellScripts]$ sh -x NonFibRecursive.sh 10 
+ clear 
+ '[' 1 -ne 1 ']' 
+ a=0 
+ b=1 
+ flag=0 
+ lastFib=0 
+ c=0 
+ limit=10 
+ echo 'Non-Fibonacci Numbers : ' 
Non-Fibonacci Numbers : 
+ nonfib 
+ let c=0+1 
+ '[' 1 -gt 1 ']' 
+ a=1 
+ b=1 
+ lastfib=1 
+ '[' 0 -eq 1 ']' 
+ nonfib 
+ let c=1+1 
+ '[' 2 -gt 1 ']' 
+ ((i=lastFib+1)) 
+ ((i<c)) 
+ '[' 1 -gt 10 ']' 
+ echo -ne '1 ' 
1 + ((i++ )) 
+ ((i<c)) 
+ a=1 
+ b=2 
+ lastfib=2 
+ '[' 0 -eq 1 ']' 
+ nonfib 
+ let c=1+2 
+ '[' 3 -gt 1 ']' 
+ ((i=lastFib+1)) 
+ ((i<c)) 
+ '[' 1 -gt 10 ']' 
+ echo -ne '1 ' 
1 + ((i++ )) 
+ ((i<c)) 
+ '[' 2 -gt 10 ']' 
+ echo -ne '2 ' 
2 + ((i++ )) 
+ ((i<c)) 
+ a=2 
+ b=3 
+ lastfib=3 
+ '[' 0 -eq 1 ']' 
+ nonfib 
+ let c=2+3 
+ '[' 5 -gt 1 ']' 
+ ((i=lastFib+1)) 
+ ((i<c)) 
+ '[' 1 -gt 10 ']' 
+ echo -ne '1 ' 
1 + ((i++ )) 
+ ((i<c)) 
+ '[' 2 -gt 10 ']' 
+ echo -ne '2 ' 
2 + ((i++ )) 
+ ((i<c)) 
+ '[' 3 -gt 10 ']' 
+ echo -ne '3 ' 
3 + ((i++ )) 
+ ((i<c)) 
+ '[' 4 -gt 10 ']' 
+ echo -ne '4 ' 
4 + ((i++ )) 
+ ((i<c)) 
+ a=3 
+ b=5 
+ lastfib=5 
+ '[' 0 -eq 1 ']' 
+ nonfib 
+ let c=3+5 
+ '[' 8 -gt 1 ']' 
+ ((i=lastFib+1)) 
+ ((i<c)) 
+ '[' 1 -gt 10 ']' 
+ echo -ne '1 ' 
1 + ((i++ )) 
+ ((i<c)) 
+ '[' 2 -gt 10 ']' 
+ echo -ne '2 ' 
2 + ((i++ )) 
+ ((i<c)) 
+ '[' 3 -gt 10 ']' 
+ echo -ne '3 ' 
3 + ((i++ )) 
+ ((i<c)) 
+ '[' 4 -gt 10 ']' 
+ echo -ne '4 ' 
4 + ((i++ )) 
+ ((i<c)) 
+ '[' 5 -gt 10 ']' 
+ echo -ne '5 ' 
5 + ((i++ )) 
+ ((i<c)) 
+ '[' 6 -gt 10 ']' 
+ echo -ne '6 ' 
6 + ((i++ )) 
+ ((i<c)) 
+ '[' 7 -gt 10 ']' 
+ echo -ne '7 ' 
7 + ((i++ )) 
+ ((i<c)) 
+ a=5 
+ b=8 
+ lastfib=8 
+ '[' 0 -eq 1 ']' 
+ nonfib 
+ let c=5+8 
+ '[' 13 -gt 1 ']' 
+ ((i=lastFib+1)) 
+ ((i<c)) 
+ '[' 1 -gt 10 ']' 
+ echo -ne '1 ' 
1 + ((i++ )) 
+ ((i<c)) 
+ '[' 2 -gt 10 ']' 
+ echo -ne '2 ' 
2 + ((i++ )) 
+ ((i<c)) 
+ '[' 3 -gt 10 ']' 
+ echo -ne '3 ' 
3 + ((i++ )) 
+ ((i<c)) 
+ '[' 4 -gt 10 ']' 
+ echo -ne '4 ' 
4 + ((i++ )) 
+ ((i<c)) 
+ '[' 5 -gt 10 ']' 
+ echo -ne '5 ' 
5 + ((i++ )) 
+ ((i<c)) 
+ '[' 6 -gt 10 ']' 
+ echo -ne '6 ' 
6 + ((i++ )) 
+ ((i<c)) 
+ '[' 7 -gt 10 ']' 
+ echo -ne '7 ' 
7 + ((i++ )) 
+ ((i<c)) 
+ '[' 8 -gt 10 ']' 
+ echo -ne '8 ' 
8 + ((i++ )) 
+ ((i<c)) 
+ '[' 9 -gt 10 ']' 
+ echo -ne '9 ' 
9 + ((i++ )) 
+ ((i<c)) 
+ '[' 10 -gt 10 ']' 
+ echo -ne '10 ' 
10 + ((i++ )) 
+ ((i<c)) 
+ '[' 11 -gt 10 ']' 
+ flag=1 
+ break 
+ a=8 
+ b=13 
+ lastfib=13 
+ '[' 1 -eq 1 ']' 
+ exit 

문제가에서 시작하는 곳은 다음과 같습니다하자 C = 1 + 1 '[' 2 -gt 1 ']'가 보여> 1. 2 그러나 방법이있을 수 있습니까? CurrentFib = 2 LastFib = 1

따라서 2-1 = 1입니다.

내가 문제를 적절하게 설명했으면 좋겠다. 자세한 설명이 필요하면 질문하십시오.

수정 코드 :

clear 

nonfib() 
{ 
    let c=$a+$b 
    if [ $(($c-$lastFib)) -gt 1 ] 
    then 
    for ((i=lastFib+1; i<c; i++)) 
    do 
     if [ $i -gt $limit ] 
     then 
     flag=1 
     break 
     fi 
     echo -ne $i" " 
    done 
    fi 
    a=$b 
    b=$c 
    lastFib=$c 
    if [ $flag -eq 1 ] 
    then 
    echo 
    exit 
    fi 
    nonfib 
} 

if [ $# -ne 1 ] 
then 
    echo "Invalid Argument!!" 
    exit 
fi 
a=0 
b=1 
flag=0 
lastFib=0 
c=0 
limit=$1 
echo "Non-Fibonacci Numbers : " 
nonfib 

당신을 감사드립니다.

lastfib=$c 

그것은해야한다 : bash에서

lastFib=$c 
# ^
# Capital F 

변수 이름은 대소 문자를 구분 감사 Priyabrata

+0

'내가 기대하는 것을하지 못합니다 ... '- 당신이 정교 할 수 있습니까? 작동이 잘못되었거나 오류가 발생 했습니까? – devnull

+0

설명이 메인 포스트에 추가되었습니다. – Priyabrata

+1

+1 설명을 추가합니다. 그러나 미래에는 그다지 많지 않습니다. 우리는 실제로 '깨끗한'빈 줄을 볼 필요가 없습니다. 결국 그것은 문제의 일부가 아닙니다 ;-) 행운을 빈다. – shellter

답변

2

문제는이 라인입니다.

+2

나는 망치로 내 머리를 치고 싶다 !! 젠장, 젠장!.........에 대한 IDE가 정말 없어. – Priyabrata

관련 문제