Redução de chamadas recursivas vs clareza de código

Re: Redução de chamadas recursivas vs clareza de código

por José Coelho de Pina -
Número de respostas: 0

Oi Ian,

[. . .] Qual a opinião de vocês? [. . .]

Bem, aqui vai a minha opinião... Um pouco (bastante) confusa...

Essas coisas são bem pessoais e altamente discutíveis.
Não tenho uma opinião objetiva sobre isto, especialmente por não saber o que é "código limpo".
Cada vez que eu olho algo que já escrevi, acabo reescrevendo de maneira um pouco (as vezes muito) diferente.
Em geral eu prefiro fazer o código o mais claro que eu puder.
Por exemplo, eu frequentemente declaro variáveis que não seriam necessárias, simplemente por que acho que fica mais claro.

Quando eficiência é algo importante, eu acabo tentando responder as perguntas:

Fazendo o código um pouco mais obscuro/complicado há um ganho "realmente" significativo?
Onde está o "gargalo", onde devo me preocupar em otimizar.

Profiling costuma ser uma ferramente útil que ajuda a responder essas questões:

http://en.wikipedia.org/wiki/Profiling_(computer_programming) (conceitualmente)
http://en.wikipedia.org/wiki/Profile-guided_optimization (conceitualmente)
http://www.thegeekstuff.com/2012/08/gprof-tutorial/ (usando gcc)

As vezes acabo fazendo mais de uma versão do programa.

Em particular, sobre recursão, considere a solução qu fizermos na aula para o Problema das Torres de Hanoi.
A base da recursão era "n == 0". Acho que o código ficou simples.
Se a base fosse "n == 1" o código ganharia algums linhas (3?). Não acho que ficaria complicado e economizaria chamadas recursivas.
No entanto, no caso, como o número de movimentos é 2n-1, acho que a economia seria "dinheiro de pinga".

Sei lá, . . .

P.S. Mudando de assundo sorriso

A função hanoi(n,...) com base n == 0 faz Z( n) chamadas recursivas onde Z( n) é dado pela recorrência

Z(0) = 0          
Z( n) =  2Z( n-1) + 2, n > 0 

A solução dessa recorrência é Z( n) = ?.

Já, a função hanoi(n,...) com base n == 1 faz U( n) chamadas recursivas onde U( n) é dado pela recorrência

U(0) = 0
U(1) = 1
U( n)= 2U( n-1) + 2, n > 1

A solução dessa recorrência é U( n) = ?

Bem, sabemos que o número de movimentos necessários para resolver o problema das Torres de Hanoi com n discos é M( n)= 2n-1, que é o número mínimo de mensagens que o programa deve imprimir.