Я пишу простой генератор последовательности без фибоначчи с диапазоном, взятым с использованием аргумента командной строки. Я уже реализовал версию 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
'не может делать то, что я ожидаю ...' - не могли бы вы уточнить? Он работает неправильно, выдает ошибку, ...? – devnull
Уточнение добавлено в главный пост. – Priyabrata
+1 для добавления разъяснений. В будущем, однако, меньше, чем может быть. Нам действительно не нужно видеть «ясную» и пустую пустые строки; ведь это не часть проблемы ;-) Удачи. – shellter