язык сценариев bash
... да, именно bash, потому что я его показывал в сравнительном ряду кодов, пусть он будет и здесь.
Можно ли организовать подобные вычисления в интерпретаторе bash, учитывая, что функции bash могут возвращать только значения кода завершения в пределах [0...255], т. е. в нашем смысле — не имеющие возвращаемых вычисленных значений?
Наверняка можно, в IT можно всё, но это может оказаться довольно изощрённо... (может я на досуге сделаю и покажу такое решение).
Но можно организовать подобные вычисления, если сам скрипт будет
рекурсивно вызывать свои копии. Вот только то и всего:
Реализация задачи в bash (файл fido.sh):
Код: Выделить всё
#!/bin/bash
if [ "$1" -lt "2" ]
then
echo "1"
else
f1=$($0 `expr $1 - 1`)
f2=$($0 `expr $1 - 2`)
echo `expr $f1 + $f2`
fi
Я не рискну вызывать такое решение с аргументом 30 (как остальные варианты) — я просто не дождусь решения... Но выполняется такого скрипт вполне успешно:
Код: Выделить всё
$ bash --version
GNU bash, version 4.2.37(1)-release (i486-pc-linux-gnu)
…
# time nice -9 ./fibo.sh 8
34
real 0m5.814s
user 0m0.024s
sys 0m0.040s
# time nice -9 ./fibo.sh 10
89
real 0m16.574s
user 0m0.124s
sys 0m0.068s
# time nice -9 ./fibo.sh 12
233
real 0m41.785s
user 0m0.364s
sys 0m0.232s
Получается, что скрипт bash вычисляет функцию от 8 столько же, сколько не очень «спешному» Perl требуется для вычисления функции от 26 (это при экспоненциальном то росте!):
Код: Выделить всё
# time nice -9 perl fibo.pm 26
196418
real 0m5.775s
user 0m0.396s
sys 0m0.000s
... это если грубо прикинуть по оценкам сложности (вначале: 10 раз на каждые +5) то значение для 30 скрипт должен вычислять порядка 16 * 10^4 сек. ... 16000 или 4-5 часов
Практического смысла показанная реализация на bash не имеет, но сама такая возможность интересна.