Taylor Series of a Function with Periodic Derivatives
JavaScript (ES6), 183 bytes

(c,a,n)=&gt;[...Array(n)].map((_,i)=&gt;(s=c[i%c.length].replace(/x/g,a),i?s=s.replace(/^-?/,c=&gt;c?` - `:` + `)+(a&gt;0?`*(x-${a})`:a&lt;0?`*(x+${-a})`:`*x`):s,i&gt;1?s+`^${i}/${f*=i}`:s),f=1).join``


Lots of tedious string manipulation. Explanation:

(c,a,n)=&gt;                               Parameters
 [...Array(n)].map((_,i)=&gt;(             Loop i from 0 to n-1
  s=c[i%c.length]                       Get the right element from the cycle
   .replace(/x/g,a),                    Substitute a in for x
  i?                                    If i &gt; 0
   s=s.replace(/^-?/,c=&gt;c?` - `:` + `)  Turn the sign into an operator
    +(a&gt;0?`*(x-${a})`                   If a &gt; 0 then * (x - a)
     :a&lt;0?`*(x+${-a})`                  If a &lt; 0 then * (x + -a)
     :`*x`)                             If a == 0 then * x
   :s,                                  No change if i &lt; 1
  i&gt;1?                                  If i &gt; 1
   s+`^${i}/${f*=i}`                    Append ^ i / i!
   :s),                                 No change if i &lt; 2
  f=1                                   0! == 1
 ).join``                               Join all the results together


170 bytes if you remove all the whitespace:

(c,a,n)=&gt;[...Array(n)].map((_,i)=&gt;(s=c[i%c.length].replace(/x/g,a),i?s=(s[0]=='-'?'':'+')+s+(a&gt;0?`*(x-${a})`:a&lt;0?`*(x+${-a})`:`*x`):s,i&gt;1?s+`^${i}/${f*=i}`:s),f=1).join``