How to apply or map a list of functions to a list of data?
Use PadRight
with the cyclical padding setup:
funcs = {f1, f2, f3};
data = Range[1, 20];
MapThread[#1[#2] &, {PadRight[funcs, Length@data, funcs], data}]
or
MapThread[Compose, {PadRight[funcs, Length@data, funcs], data}]
{f1[1], f2[2], f3[3], f1[4], f2[5], f3[6], f1[7], f2[8], f3[9], f1[10], f2[11], f3[12], f1[13], f2[14], f3[15], f1[16], f2[17], f3[18], f1[19], f2[20]}
Here's how you can do it in a simple way:
functionMap[funcs_List, data_] := Module[{fn = RotateRight[funcs]},
First[(fn = RotateLeft[fn])][#] & /@ data]
Use it as:
functionMap[{f1, f2, f3}, Range[20]]
(* {f1[1], f2[2], f3[3], f1[4], f2[5], f3[6], f1[7], f2[8], f3[9], f1[10],
f2[11], f3[12], f1[13], f2[14], f3[15], f1[16], f2[17], f3[18], f1[19], f2[20]} *)
MapIndexed[{f1, f2, f3}[[Mod[First@#2, 3, 1]]][#1] &, data]
does what you want (thanks to Sjoerd for pointing out a silly inefficiency).