2013-08-20 40 views
2

我正在寫一個簡單的非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

+0

'不能做我期望的事情......' - 你能否詳細說明一下?它工作不正確,拋出錯誤,...? – devnull

+0

澄清添加到主帖子。 – Priyabrata

+1

加+1澄清。然而,在未來,不可多得多。我們並不需要看到「清晰」和一堆空白行;畢竟這不是問題的一部分;-)祝你好運。 – shellter

回答

2

的問題是這一行:

lastfib=$c 

它應該是:

lastFib=$c 
# ^
# Capital F 

bash變量名是區分大小寫的。

+2

我覺得,用錘子敲我的頭!上帝該死!感謝隊友..我很想念這個IDE :( – Priyabrata