Пример 22-9. Использование локальных переменных при рекурсии

Пример 22-9. Использование локальных переменных при рекурсии

#!/bin/bash

# факториал

# ---------

# Действительно ли bash допускает рекурсию?

# Да! Но...

# Нужно быть действительно дубинноголовым, чтобы использовать ее в сценариях

# на языке командной оболочки.

MAX_ARG=5

E_WRONG_ARGS=65

E_RANGE_ERR=66

if [ -z "$1" ]

then

echo "Порядок использования: `basename $0` число"

exit $E_WRONG_ARGS

fi

if [ "$1" -gt $MAX_ARG ]

then

echo "Выход за верхний предел (максимально возможное число -- 5)."

# Вернитесь к реальности.

# Если вам захочется поднять верхнюю границу,

# то перепишите эту программу на настоящем языке программирования.

exit $E_RANGE_ERR

fi

fact ()

{

local number=$1

# Переменная "number" должна быть объявлена как локальная,

# иначе результат будет неверный.

if [ "$number" -eq 0 ]

then

factorial=1 # Факториал числа 0 = 1.

else

let "decrnum = number - 1"

fact $decrnum # Рекурсивный вызов функции.

let "factorial = $number * $?"

fi

return $factorial

}

fact $1

echo "Факториал числа $1 = $?."

exit 0

Еще один пример использования рекурсии вы найдете в Пример A-18. Не забывайте, что рекурсия весьма ресурсоемкое удовольствие, к тому же она выполняется слишком медленно, поэтому не следует использовать ее в сценариях.