MathGroup Archive 2005

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: letrec/named let

  • To: mathgroup at smc.vnet.net
  • Subject: [mg56753] Re: letrec/named let
  • From: Daniel Roy <droy at mit.edu>
  • Date: Thu, 5 May 2005 06:01:34 -0400 (EDT)
  • Organization: MIT
  • Sender: owner-wri-mathgroup at wolfram.com

> You always give C as first argument; so it is superflous.
> Pleas note, that C is reserved:
> "C[i] is the default form for the ith parameter or constant
> generated in representing the results of various symbolic
> computations."
> 
> CompressNumericalSequence[S_]:=
>     Module[{fC},
>       fC=Function[{R,i},
>           If[i<Max[R],
>             If[Length[Position[R,i]]==0,
>               fC[(If[#>i,#-1,#])&/@R,i],
>               fC[R,i+1]],R]];
>       fC[S,1]];
> 
> but this will fail for big numbers unless you set $IterationLimit
> appropriate. Hence,

I'm not so sure this is true.  This function is tail-recursive.  Does
mathematica handle tail recursion properly?

> 
> CNS[lst_] := lst /. (Thread[#1 -> Ordering[Ordering[#1]]] & )[
>      Module[{f}, f[x_] := (f[x] = Sequence[]; x); f /@ lst]];
> 
> or even better
> 
> CNS[lst_] := Module[{tmp = First /@ Split[Sort[lst]]},
>    Flatten[(Position[tmp, #1] & ) /@ lst]]
> 
> would do the task more reliable (and much more faster).

Neither of these functions do what CompressNumericalSequence does... And
because I'm no mathematica-guru I don't yet quite understand what they
do, anyway.  Furthermore, they are actually SLOWER than my code (see
below on a test of 1,000,000 entries).
 
> > Also, is it possible to do letrec in mathematica?  (essentially, i know
> > i can do recursive function declarations at the top level... my question
> > is whether i can do them at lower levels?)... 

> Regards,
> Peter

dan


  • Prev by Date: Re: named pattern variable scoped as global, should be local
  • Next by Date: Re: Cases and Nonatomic expression
  • Previous by thread: Re: letrec/named let
  • Next by thread: Re: letrec/named let