Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

Fold is an extension of Nest for 2 arguments. How does one extend this concept to multiple arguments. Here is a trivial example:

FoldList[#1 (1 + #2) &, 1000, {.01, .02, .03}]

Say I want do something like:

FoldList[#1(1+#2)-#3&,1000,{.01,.02,.03},{100,200,300}] 

where 100,200,300 are the values for #3. I know Fold doesn't work this way. I'm looking for an approach that will work like this... ((1000*(1.01)-100)*1.02-200)*1.03-300).

Is there a way to extend Fold to more than 2 arguments? or is there a better approach for solving problems like this?

share|improve this question
2  
I have described exactly this problem here, under the section "Restriction of Fold-ed function to two arguments is spurious". –  Leonid Shifrin Dec 27 '13 at 13:54
2  
Please, format your question. –  Mr.Wizard Dec 27 '13 at 13:54
    
Thanks...both great solutions. –  RobK Dec 27 '13 at 16:14

2 Answers 2

up vote 12 down vote accepted

Yes, there is. Group your extra arguments in a list, and address them by their positions in the function under Fold. For your particular example:

FoldList[#1 (1 + First@#2) - Last@#2 &, 1000, Transpose@{{.01, .02, .03}, {100, 200, 300}}]

(* {1000, 910., 728.2, 450.046} *)
share|improve this answer

To achieve the specific syntax you requested we can use something like this:

multiFoldList[f_, start_, args__List] :=
  FoldList[f @@ Prepend[#2, #] &, start, {args}\[Transpose]]

Example:

multiFoldList[#1 (1 + #2) - #3 &, 1000, {.01, .02, .03}, {100, 200, 300}]
{1000, 910., 728.2, 450.046}

Here is another formulation which tests slightly faster and may be easier to read:

multiFoldList[f_, start_, args__List] :=
  Module[{ff},
    ff[x_, {y__}] := f[x, y];
    FoldList[ff, start, {args}\[Transpose]]
  ]
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.