terça-feira, 31 de dezembro de 2013


E depois de muito sofrimento eu cheguei a uma conclusão que muita gente já deve conhecer: 
Aprender dói, mas não dói pouco, dói muito!

Apesar disso, a boa notícia é que todo aprendizado é gratificante. Cheguei a esta conclusão depois que comecei a programar usando o editor Vim. Durante muito tempo eu evitei usá-lo porque achava que nada era mais cômodo que os outros editores, além de não entender a necessidade de digitar tantos comandos para alterar um simples arquivo!
Depois de muita resistência, decidi encarar o Vim e hoje posso dizer que foi umas das melhores coisas que eu fiz. No início, foi muito complicado, mas depois de uma semana eu já estava mais familiarizado com os comandos. Gostaria que outros programadores também conhecessem o Vim, por isso farei alguns tutorias e postarei aqui no blog. Espero que vocês gostem ou não!


@CompilouSemErro

Posted on terça-feira, dezembro 31, 2013 by Unknown

No comments

quinta-feira, 31 de outubro de 2013


O CompilouSemErro também está no Twitter, lá postamos diariamente várias dicas sobre Linux e programação, não deixem de conferir, sigam @CompilouSemErro e fiquem por dentro do mundo Linux.

Confiram as melhores da semana:






@CompilouSemErro

Posted on quinta-feira, outubro 31, 2013 by Unknown

No comments



O InductionCode possui uma série de posts sobre Torres de Hanói, com implementações em várias linguagens e uma abordagem super intuitiva. Vale a pena conferir! Acessem Torres de Hanói no InductionCode

@CompilouSemErro

Posted on quinta-feira, outubro 31, 2013 by Unknown

No comments


"To understand recursion, we first need to understand recursion." - Anonymous

Entender recursividade é algo fundamental para qualquer bom programador, pois diversas estruturas na computação são naturalmente recursivas, como exemplo, podemos citar a estrutura de diretórios em um sistema operacional.

Uma definição recursiva é mais que um simples trecho de código, é uma forma enxuta e eficiente de definir processos computacionais e expressar ideias. Mas o que vem a ser um procedimento recursivo?

Definição: "Um procedimento recursivo, é todo procedimento definido em termos dele mesmo".

Recursão é uma técnica muito poderosa em definições matemáticas. Como exemplo, podemos citar a função fatorial:
                                                                    F(0) = 1
                                                                    F(n) = n * F(n-1)
A definição acima mostra que para encontrarmos o fatorial de n, precisamos encontrar o fatorial de n-1, e para encontrar o fatorial de n-1, precisamos encontrar o fatorial de n-2, e assim sucessivamente, até alcançarmos o caso base F(0). Fazendo n = 5, temos:
                              F(5) = 5 * F(4)
                                               F(4) = 4 * F(3)
                                                                F(3) = 3 * F(2)
                                                                                 F(2) = 2 * F(1)
                                                                                                  F(1) = 1 * F(0)
                                                                                                                   F(0) = 1

Podemos perceber que em cada etapa precisamos da solução para um problema de tamanho menor.

Agora, vamos apresentar algumas implementações recursivas da função fatorial.

Implementação em Haskell
factorial :: Int -> Int
factorial 0 = 1
factorial n = n * factorial n-1
Implementação em C
#include <stdio.h>
#include <stdlib.h>

int factorial(int n) {
  if(n == 0)
    return 1;
  else
    return n * factorial(n-1);
}

int main() {
  int n;
  scanf("%i", &n);
  printf("%i", factorial(n));
  return 0;
}
Após essa explanação, é importante deixar claro que recursividade não serve apenas para calcular fatorial, que foi abordado nesse post inicial por ser um exemplo simples. No entanto, existem aplicações muito mais interessantes que abordaremos nos posts seguintes.

Posted on quinta-feira, outubro 31, 2013 by Unknown

No comments


A partir de hoje, vamos iniciar uma série de postagens sobre recursividade. Trataremos de problemas simples e avançados. O principal objetivo é mostrar o poder dessa técnica e incentivar os programadores e principalmente os iniciantes a usarem sem medo. É importante lembrar que a recursividade deve ser usada com cautela, mas a decisão de usar a recursão ou não, só pode ser tomada depois que analisarmos fatores como tempo de execução e alocação de memória.
Espero contar com a participação de todos os leitores, para que possamos discutir mais sobre esse tema. Por isso, interajam, comentem nos posts, assim todos ganham.

@CompilouSemErro

Posted on quinta-feira, outubro 31, 2013 by Unknown

No comments


O Inductioncode possui uma série de postagens sobre árvores binárias com diversas implementações. A seguir apresento algumas delas:

Posted on quinta-feira, outubro 31, 2013 by Unknown

No comments

quarta-feira, 30 de outubro de 2013

Não é difícil encontrar programadores que odeiam recursividade. Mas por quê tanto desprezo por uma técnica tão poderosa? Será que é difícil escrever funções recursivas? Códigos recursivos são sempre lentos?

Agora a verdade:
Só fala mal da recursividade quem NÃO sabe usar recursividade!

Durante a fase de projeto de um programa, é importante descobrir inicialmente qual problema estamos tentando resolver. Ou seja, precisamos inicialmente descobrir "O QUE DEVE SER FEITO", e só depois nos preocuparemos com o "COMO FAZER".

Na fase de projeto, o programador deve abstrair o problema, ou seja, deve evitar se preocupar com detalhes irrelevantes. Por exemplo, decidir se o programa será recursivo ou iterativo é irrelevante durante o projeto, é um mero detalhe de implementação!

Infelizmente, alguns programadores nunca escrevem códigos recursivos, e sabem qual a justificativa? Dizem que recursividade é lenta. E isso tem um motivo: Aprenderam recursividade com fatorial e fibonacci! E todos sabem que não devemos usar recursividade nesses casos.

Existem inúmeras situações onde a recursividade é indispensável. Basta pensar em árvores binárias, que são estruturas naturalmente recursivas. Já imaginaram manipular árvores binárias sem recursividade? Até dá para fazer, mas o esforço é desnecessário. Vamos analisar uma implementação recursiva que realiza o caminhamento pré-ordem em uma árvore binária:
void preOrdem(struct tnode *t)
{
  if(t != NULL)
  {
    printf("%d ", t->value);
    preOrdem(t->left);
    preOrdem(t->right);
  }
}
Podemos perceber que de forma clara e enxuta resolvemos o problema em poucas linhas.
Mas ainda tem quem se preocupe com o "estouro da pilha" de execução dos programas! E com isso, não quero dizer que o estouro não possa acontecer, mas será que na maioria das vezes o problema é mesmo o tal "estouro da pilha"?

Posted on quarta-feira, outubro 30, 2013 by Unknown

7 comments