나는 간단한 비 피보나치 시퀀스 생성기를 작성 중이며 명령 행 인수를 사용하여 범위를 지정했다. 이미 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
'내가 기대하는 것을하지 못합니다 ... '- 당신이 정교 할 수 있습니까? 작동이 잘못되었거나 오류가 발생 했습니까? – devnull
설명이 메인 포스트에 추가되었습니다. – Priyabrata
+1 설명을 추가합니다. 그러나 미래에는 그다지 많지 않습니다. 우리는 실제로 '깨끗한'빈 줄을 볼 필요가 없습니다. 결국 그것은 문제의 일부가 아닙니다 ;-) 행운을 빈다. – shellter