我正在寫一個簡單的非Fibonacci序列發生器,使用命令行參數中的範圍。 我已經實現了Non_Recursive版本,並且它按預期工作。Linux Shell腳本和遞歸,變量不保留值
下面是代碼的非遞歸版本:
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"
現在,我走上前去,並使用遞歸的方法實現相同的邏輯。
這裏是Recusive實施:
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 ]
不能做什麼,我希望它做的事。 它檢查當前斐波那契數字與上次生成的數字之間的差異,如果它們之間存在值。 但是,這是執行出錯的地方。
需要此幫助。
編輯
我跑的代碼,如: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 ']'
它表明,2> 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
謝謝。 問候 Priyabrata
'不能做我期望的事情......' - 你能否詳細說明一下?它工作不正確,拋出錯誤,...? – devnull
澄清添加到主帖子。 – Priyabrata
加+1澄清。然而,在未來,不可多得多。我們並不需要看到「清晰」和一堆空白行;畢竟這不是問題的一部分;-)祝你好運。 – shellter