Ruud H.G. van Tol on Wed, 22 Mar 2023 16:08:50 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: defining a recurrence



Hello Charles,

The recursive example on rosettacode:

fact(n)=if(n<2,1,n*fact(n-1))

is not "optimal" (from the "technical/implementation" POV),
because the recursive part is coded one step deeper than strictly needed,
which easily leads to a fatter stack than strictly needed.

A test with 10^4 exposes that.

-- -- -- -- -- -- --

The "bare" version that I showed before:

fact1(n)= if(n<2, return(1)); n * fact1(n-1)

shows no warnings and returns the value for 10^4.

An "inside-if" version fails with 10^4, with a "deep recursion." error.

And even the "bare" easily fails, for example with 10^5.

-- -- -- -- -- -- --

These are all meant as academic recursion-oriented observations.
Just be aware that recursion generally needs extra resources
while running, so use it wisely.

Some languages are more declarative than others.
There exist languages that rewrite recursive to iterative
at compilation, even just to win benchmarks. :)

--- Ruud




On 2023-03-22 15:11, Charles Greathouse wrote:
See also
https://rosettacode.org/wiki/Factorial#PARI/GP
which is often a good resource for 'how do I do this in PARI'.

On Wed, Mar 22, 2023 at 5:00 AM Ruud H.G. van Tol <rvtol@isolution.nl> wrote:


    On 2023-03-22 02:27, Anders Hellström wrote:
    > Factorial with or without recurrence.
    >
    > fact1(n)=my(m);if(n==1,m=1,m=n*fact1(n-1));m \\recurrence

    For "technical/implementation reasons"
    it is likely better to define such as

    fact1(n)= if(1==n, return(1)); n * fact1(n-1)

    For example test with 10^4.