#!/bin/bash
function factorial()
{
if (($1 < 2))
then
echo 1
else
echo $(($1 * $(factorial $(($1 - 1)))))
fi
}
Этот будет работать лучше.
(Она работает до 25, в любом случае, что должно быть достаточно, чтобы доказать пункт о рекурсии.)
Для более высоких чисел, Ьс бы инструментом для использования, делая девятую строчку выше:
echo "$1 * $(factorial $(($1 - 1)))" | bc
, но вы должны быть немного осторожным с Ьсом -
$ factorial 260
38301958608361692351174979856044918752795567523090969601913008174806\
51475135399533485285838275429773913773383359294010103333339344249624\
06009974551133984962615380298039823284896547262282019684886083204957\
95233137023276627601257325925519566220247124751398891221069403193240\
41688318583612166708334763727216738353107304842707002261430265483385\
20637683911007815690066342722080690052836580858013635214371395680329\
58941156051513954932674117091883540235576934400000000000000000000000\
00000000000000000000000000000000000000000
был довольно нагрузка на моей бедной системе!
Коды возврата - это один байт, поэтому это прерывается при n> 5. Чтобы исправить это, вам нужно будет изменить функцию, чтобы эхо результат, а не s и код возврата. – tripleee
+1 и +9000 - @tripleee. Функции в bash должны отражать результаты, а не возвращать их. – Sorpigal
Синтаксис '$ [...]' устаревает десятилетиями. Прекратите использовать его. – geirha