El texto al que se refiere es correcto, cambiar una variable local se considera un efecto secundario.
No dice necesariamente que esto sea algo malo. Simplemente no es programación funcional. En lenguajes de programación funcionales puros, escribiría el ciclo de forma recursiva, eliminando la necesidad de cambiar variables.
Escribir funciones como estas (que no tienen efectos secundarios observables) es una buena práctica en cualquier idioma, simplemente no es una programación funcional.
Editar: Ahora veo tu observación sobre los efectos secundarios "malos". No diría que los efectos secundarios son malos. En la mayoría de los lenguajes principales, es difícil programar sin ellos, y creo que muchos programadores piensan en términos de efectos secundarios. Pero en grandes proyectos de software, confiar demasiado en los efectos secundarios puede hacer que su vida sea bastante miserable. Here's a nice example involving singletons (the ultimate way to cause side effects)
En un lenguaje que prohíbe los efectos secundarios, hay menos sorpresas para usted como programador, pero también para el compilador. El código funcional puro es más fácil de analizar y paralelizar, y es, al menos teóricamente, más fácil de optimizar por el compilador.
W.r.t. efectos secundarios, tenga en cuenta que FP vs. programación procedural [es ortogonal a IP vs. DP] (http://stackoverflow.com/questions/602444/what-is-functional-declarative-and-imperative-programming/8357604#8357604) –