Wyobraźmy mam zdefiniowane rekurencyjnej silnia w Mathematica, tak:W Mathematica, dlaczego zastąpienie w funkcji rekurencyjnej nie kończy się?
Clear[fact]
fact[0] = 1
fact[n_] := n fact[n - 1]
Ocenianie fakt [10] potwierdza, że funkcja działa i kończy.
Trochę przykładowego zszywki, ale służy temu celowi. W rzeczywistości moje pytanie dotyczy ogólnie definicji funkcji rekursywnych.
Spodziewałem oceny następującą wymianę wypowiedzenia, a także:
x fact[x-1] /. x -> 2
Niestety, biegnie do granicy głębokości rekurencji:
$RecursionLimit::reclim: Recursion depth of 256 exceeded.
Spodziewałem się zobaczyć coś takiego:
2 fact[2-1]
lub tylko wartość
2
UPDATE: Alternatywą rekurencyjna definicja rzeczywistościrobi pracy zgodnie z oczekiwaniami:
Clear[fact]
fact[n_] := If[n < 1, 1, n fact[n - 1]]
Ale ten fakt (pun przeznaczone ;-) czyni go jeszcze bardziej tajemniczy do mnie: Dlaczego to robi zachowywać się tak różnie?
Moje pytanie jest dwojaki:
Nawet z wbudowaną pomoc i przeszukiwania sieci w poszukiwaniu wskazówek, nie mogę wyjaśnić, dlaczego w Mathematica nalega, najwyraźniej, utrzymując wynik symboliczne, zamiast oceny "pośrednie" wyniki i ładnie się kończą. Kto podejmuje sensowne wytłumaczenie?
Jak przekonać Mathematica do działania zgodnie z moimi oczekiwaniami (inne niż użycie alternatywy przy użyciu If [])?
Naprawdę jestem zdziwiony tym, i naprawdę mam nadzieję, że ktoś tam może mi pomóc.
/Twan
Aha, to ma sens: Mathematica najpierw ocenia LHS z /. i _then_ wykonuje zastępstwo.A dzięki Hold [] możesz odłożyć tę "gorliwą" ocenę. Dzięki za wspaniałą odpowiedź: skuteczna, trafna, przejrzysta i zwięzła! Moje komplementy – nanitous
@nanitous Cheers! Jeśli jedna z trzech odpowiedzi odpowiada na twoje pytanie, możesz oznaczyć ją jako zaakceptowaną odpowiedź, tak aby pojawiła się u góry (i zapewnia reputację wzmacniacza). – acl
dzięki za wskazanie tego! – nanitous