Re: Map and functional constructs to replace iterative statements

*To*: mathgroup at smc.vnet.net*Subject*: [mg96863] Re: [mg96783] Map and functional constructs to replace iterative statements*From*: Sseziwa Mukasa <mukasa at jeol.com>*Date*: Thu, 26 Feb 2009 07:57:02 -0500 (EST)*References*: <200902250900.EAA15513@smc.vnet.net>

On Feb 25, 2009, at 4:00 AM, Andreas wrote: > I have begun to replace Table, Do, While, or For, but in my > thinking with Map, Inner, Outer and other functional programming > constructs as I learn more about Mathematica. > > But, I'm stuck. I need to figure out how to use Map (or some > related approach) when a function needs both a current value and a > previous value in a time series, such as a percentage change > function (or perhaps more generally stated, when I need to refer to > previous values in a series or even previous calculations). But > first a simple case: > > percentChange[currentValue_, previousValue_] := 100 * > ( currentValue - previousValue) / previousValue > > I know how to apply this iteratively, but how can I do it with Map > or some other functional construct? One option is to use create the pairs of arguments, then apply the function percentChange[#,#2]&@@@Transpose[{Rest[timeSeries],Most[timeSeries]}] Another option is to do it recursively: computeChanges[{results_,{previous_,current_}}]:=Append [results,percentChange[previous,current]] computeChanges[{results_,{args__}}]:=computeChanges[{Append [results,percentChange[{args}[[2]],{args}[[1]]]],Rest[{args}]}] computeChanges[timeSeries_]:=computeChanges[{{},timeSeries}]/;VectorQ [timeSeries]&&Length[timeSeries]>=2 I realize the recursive solution does not use functional programming constructs but I've found that not having to worry about explicit indices can result in less bugs. Regards, Sseziwa Mukasa

**References**:**Map and functional constructs to replace iterative statements***From:*Andreas <aagas@ix.netcom.com>