2013-08-20 2 views
2

Я пишу простой генератор последовательности без фибоначчи с диапазоном, взятым с использованием аргумента командной строки. Я уже реализовал версию Non_Recursive, и она работает так, как ожидалось.Linux-скрипт и рекурсия, переменная не сохраняющая значение

Вот код на нерекурсивна Версия:

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 ] 

не в состоянии сделать то, что я ожидаю, что это сделать. Он проверяет разницу между текущим числом фибоначчи и последним сгенерированным номером, если есть значения между ними. Но это - то, где выполнение идет не так.

Нужна помощь в этом.

редактировать

Я побежал код как: 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 

Это где проблема начинается с: с = 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

Смежные вопросы