Если вы хотите напечатать каждое значение Фибоначчи от 1 до $ n, я предлагаю:
fib_r() {
local i=$1
if (( i < 0 )); then
echo "Error: negative numbers not allowed" >&2
exit 1
elif (( i <= 1 )); then
echo $i
else
echo $(( $($FUNCNAME $((i - 1)) ) + $($FUNCNAME $((i - 2)) ) ))
fi
}
fib() {
local i
for (( i = 1; i <= $1; i++ )); do
fib_r $i
done
}
fib 10
вывод
0
1
1
2
3
5
8
13
21
34
Это по-прежнему одна переменная, хотя по одной на функцию.
Я использую переменную bash $ FUNCNAME в рекурсивной функции, чтобы вам не приходилось жестко кодировать имя функции внутри себя.Я получил немного, не обновив эту строку, когда переименовал функцию.
Конечно, ваша производительность значительно улучшится, если вы кешируете результаты: "fib 16" занимает у меняВМ, около 3,5 с без кэширования и около 0,03 с без кэширования.
fib_r() {
local i=$1
if (( i < 0 )); then
echo "Error: negative numbers not allowed" >&2
exit 1
elif [[ -n ${fib_cache[i]} ]]; then
echo "${fib_cache[i]}"
elif (( i <= 1 )); then
echo $i
else
echo $(( $( $FUNCNAME $((i - 1)) ) + $( $FUNCNAME $((i - 2)) ) ))
fi
}
fib_cache=()
fib() {
local i
for ((i=1; i<=$1; i++)); do
fib_cache[i]=$(fib_r $i)
echo "${fib_cache[i]}"
done
}