Quando queremos fazer muitas vezes a mesma coisa não convem faze-la à mão. Se tiveram Haskell no semestre passado devem se lembrar de recursividade como metodo para resolver este problema. No entanto, em programação imperativa, podemos utilizar ciclos para resolver estes problemas.
O while
é o mais simples destes.
while(condicao){
instrucao1;
instrucao2;
etc;
}
Enquanto a condicao
for verdadeira o codigo é repetido.
Exemplo pratico:
int i = 0;
while(i < 3){
printf("%d\n",i);
i++;
}
Podemos até ler este código em linguagem natural da seguinte forma: "Enquanto o i
for menor que 3, imprimir o valor do i
e incrementar o i
".
O output deste codigo é:
0
1
2
O for
é essencialmente uma extenção do while
. Como podemos ver no exemplo prático
anterior, inicializamos uma variavel para contar iterações (i
), usamos essa mesma
variavel na condição do while
, e incrementamos a variavel no corpo do while
.
O for
permite-nos juntar estes 3 passos numa linha de codigo.
for(<expr1>; <expr2>; <expr3>){
/* corpo */
}
<expr1>
: Instrucão que será executada uma vez, antes do código dofor
<expr2>
: O equivalente à condição dowhile
. Se der0
(falso) o ciclo termina<expr3>
: Instrução que será executada no fim do corpo dofor
Exemplo prático:
int i;
for(i = 3; i < 3; i++){
printf("%d\n",i);
}
Este codigo é equivalente ao anterior. O output é o mesmo.
A recursividade é válida em C, mas não é tão eficiente como um ciclo na maioria das situações. No entanto, torna alguns algoritmos mais simples de implementar (algoritmos sobre àrvores binarias por exemplo).
void countTo(int i){
if(i >= 0){
countTo(i-1);
printf("%d\n",i);
}
}
int main(){
countTo(2);
}