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

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

por Ian Carvalho -
Número de respostas: 1

Pessoal,

Fazendo o EP, fiquei com em dúvida em relação a usar vários "if's" para reduzir o número de chamadas recursivas de uma função ou priorizar um código mais limpo que gera um número maior de chamada recursivas.

Qual a opinião de vocês?

Até que ponto compensa priorizar um ou outro? Ou sempre devemos priorizar a redução de chamadas recursivas?

 

Abraços

Em resposta à Ian Carvalho

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

por José Coelho de Pina -

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.