Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Re^3: How will you use state declared variables in Perl6?

by TimToady (Parson)
on Nov 05, 2006 at 05:15 UTC ( #582285=note: print w/replies, xml ) Need Help??

in reply to Re^2: How will you use state declared variables in Perl6?
in thread How will you use state declared variables in Perl6?

Hmm, why a hash? And why not optimize assuming the current value is already in @seen? Also, declarators need not be separate statements. So I'd probably write it like this:
sub fib (Int $n) { return 1 if $n < 2; state @seen[$n] //= fib($n-1) + fib($n-2); }
I think that may be a little clearer as well. If I wanted to golf it just a bit more I'd say:
sub fib (Int $n) { $n < 2 or state @seen[$n] //= fib($n-1) + fib($n-2); }
If I wanted to golf it a lot more I'd say:
my&fib:={$_<2or state@s[$_]//=fib($_-1)+fib $_-2}

Replies are listed 'Best First'.
Re^4: How will you use state declared variables in Perl6?
by BrowserUk (Pope) on Nov 05, 2006 at 10:39 UTC

    Um. Er...?

    pugs>sub fib (Int $n) { return 1 if $n < 2; state @seen[$n] //= fib($n +-1) + fib($n-2); } Internal error while running expression: *** unexpected "[" expecting word character, "::", "=", ":=", "::=", ";" or "}" at <interactive> line 1, column 52

    Update: This works though

    pugs> sub fib (Int $n) { state @seen; return 1 if $n < 2; @seen[$n] / +/= fib($n-1) + fib($n-2); }; undef pugs> say fib 4; 5 undef pugs> say fib 8; 34 undef pugs> say fib 800; 1121023813016570197539221312040081070329432498024398917379911096096424 +176870242714672419719090010009284331740160122026805305229708722215290 +03044406006693244742562963426 undef

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      You must be running an older pugs. In fact, the current (working) version in the pugs repository (r14657) now reads:
      sub fib (UInt $n) { (state $seen = [0,1,1]).[$n] //= fib($n-1) + fib($n-2); }
      It would also work as state @seen = 0,1,1 except there's a bug with initializing state variables using a list that causes it to reinitialize every time instead of just the first time, which, while it lets it run, kinda defeats the memoization...

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://582285]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (3)
As of 2021-06-13 02:39 GMT
Find Nodes?
    Voting Booth?
    What does the "s" stand for in "perls"? (Whence perls)

    Results (54 votes). Check out past polls.