Você sempre pode transformar uma função recursiva em iterativa? Sim, absolutamente, e a tese de Church-Turing prova se a memória serve. Em termos leigos, afirma que o que é computável por funções recursivas é computável por um modelo iterativo (como a máquina de Turing) e vice-versa. A tese não diz exatamente como fazer a conversão, mas diz que é definitivamente possível.
Em muitos casos, é fácil converter uma função recursiva. Knuth oferece várias técnicas em "The Art of Computer Programming". E, frequentemente, algo calculado recursivamente pode ser calculado por uma abordagem completamente diferente em menos tempo e espaço. O exemplo clássico disso são os números de Fibonacci ou suas seqüências. Você certamente encontrou esse problema em seu plano de graduação.
Por outro lado, certamente podemos imaginar um sistema de programação tão avançado que trate uma definição recursiva de uma fórmula como um convite para memorizar resultados anteriores, oferecendo assim o benefício de velocidade sem o incômodo de informar ao computador exatamente quais etapas siga no cálculo de uma fórmula com uma definição recursiva. Dijkstra quase certamente imaginou esse sistema. Ele passou muito tempo tentando separar a implementação da semântica de uma linguagem de programação. Por outro lado, suas linguagens de programação não determinísticas e de multiprocessamento estão em uma liga acima do programador profissional praticante.
Na análise final, muitas funções são simplesmente mais fáceis de entender, ler e escrever de forma recursiva. A menos que haja um motivo convincente, você provavelmente não deve (manualmente) converter essas funções em um algoritmo explicitamente iterativo. Seu computador manipulará esse trabalho corretamente.
Eu posso ver uma razão convincente. Suponha que você tenha um sistema de protótipo em uma linguagem de nível super alto, como [ vestindo roupas íntimas de amianto ] Scheme, Lisp, Haskell, OCaml, Perl ou Pascal. Suponha que as condições sejam tais que você precise de uma implementação em C ou Java. (Talvez seja política.) Então você certamente poderia ter algumas funções escritas recursivamente, mas que, traduzidas literalmente, explodiriam seu sistema de tempo de execução. Por exemplo, a recursão infinita da cauda é possível no esquema, mas o mesmo idioma causa um problema para os ambientes C existentes. Outro exemplo é o uso de funções lexicamente aninhadas e escopo estático, que Pascal suporta, mas C não.
Nessas circunstâncias, você pode tentar superar a resistência política ao idioma original. Você pode se reimplementar mal com o Lisp, como na décima lei de Greenspun. Ou você pode apenas encontrar uma abordagem completamente diferente da solução. Mas, de qualquer forma, certamente há um caminho.