#!/bin/bash
function factorial()
{
if (($1 < 2))
then
echo 1
else
echo $(($1 * $(factorial $(($1 - 1)))))
fi
}
ten będzie działać lepiej.
(Działa do 25, w każdym razie, co powinno wystarczyć do udowodnienia punkt o rekursji.)
Dla wyższych numerach, bc byłoby narzędzie do wykorzystania, co dziewiąty wiersz powyżej:
echo "$1 * $(factorial $(($1 - 1)))" | bc
ale trzeba być nieco ostrożny z bc -
$ factorial 260
38301958608361692351174979856044918752795567523090969601913008174806\
51475135399533485285838275429773913773383359294010103333339344249624\
06009974551133984962615380298039823284896547262282019684886083204957\
95233137023276627601257325925519566220247124751398891221069403193240\
41688318583612166708334763727216738353107304842707002261430265483385\
20637683911007815690066342722080690052836580858013635214371395680329\
58941156051513954932674117091883540235576934400000000000000000000000\
00000000000000000000000000000000000000000
był całkiem obciążać moim złym systemie!
Kody powrotne to jeden bajt, a więc dla n> 5. Aby to naprawić, należy zmienić funkcję, aby uzyskać wynik, a nie s et a kod powrotu. – tripleee
+1 i +9000 do @tripleee. Funkcje w bashu powinny wywoływać echa, a nie zwracać ich. – Sorpigal
Składnia '$ [...]' jest przestarzała od dziesięcioleci. Przestań z niego korzystać. – geirha