Есть несколько естественных способов сделать это.
Вы можете сформировать список аргументов для вашей функции «процентного уменьшения», используя Partition :
In[3]:= list = {a, b, c, d, e};
In[4]:= Partition[list, 2, 1]
Out[4]= {{a, b}, {b, c}, {c, d}, {d, e}}
Тогда вы можете применить функцию к этим:
In[6]:= f @@@ Partition[list, 2, 1]
Out[6]= {f[a, b], f[b, c], f[c, d], f[d, e]}
Использование функции уменьшения процента:
In[7]:= PercentDecrease[a_, b_] := (b - a)/a
In[8]:= PercentDecrease @@@ Partition[list, 2, 1]
Out[8]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}
(Прочтите о @@@, посмотрев заметки «Дополнительная информация» на Применить .)
Вместо раздела вы можете использовать Most и Rest , чтобы сформировать списки первого и второго аргументов, а затем объединить их, используя MapThread :
In[14]:= MapThread[PercentDecrease, {Most[list], Rest[list]}]
Out[14]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}
Другой способ состоит в том, чтобы сформировать вашу операцию (вычитание и деление) в два этапа, например:
In[10]:= Differences[list] / Most[list]
Out[10]= {(-a + b)/a, (-b + c)/b, (-c + d)/c, (-d + e)/d}
Операция деления (/) потоков по двум спискам Differences[list]
и Most[list
].