Funções em Shell Scripting, parte 4: Para entender recursão, tem que entender recursão


Ao fim dessa parte do capítulo, espero que consiga entender essa famosa frase sobre recursão.
Basicamente, usamos recursão quando, dentro de uma função, chamamos ela mesma. Porém, alteramos o argumento passado a cada chamada. Assim, o processo executa até um determinado ponto. Você vai se confundir se eu falar muito antes de mostrar. Então vamos a um exemplo, que foi usado pela banda Europe para criar sua musica de maior sucesso:
recursao.sh
-----
#!/bin/bash

contagem_regressiva ()
{
if [ $1 -eq 0 ]
then
clear
echo "The Final Countdown !!!"
sleep 1
echo "tam-dam-dam-daaaam"
sleep 1
echo "tam-nam-nam-nam-naaaam"
return 0
fi

echo $1
sleep 1
clear
novo_tempo=`expr $1 - 1`
contagem_regressiva $novo_tempo
}

clear
contagem_regressiva 5
------

Permita e execute:
chmod +x recursao.sh
./recursao.sh


Vamos lá.
Primeiramente, 'clear' limpa a tela do terminal e 'sleep 1' faz o terminal dormir por 1 segundo.
A função recebe um número como argumento, o número 5.
O primeiro 'if' teste se o argumento é 0, se for mostra a letra da música na tela. Como não é, o 'if' não é executado.
Depois, o argumento é impresso na tela. Então é criada uma nova variável a partir do argumento subtraído de 1.
Depois vem o pulo do gato, que é chamar a própria função, mas agora usando o 4 como argumento.
Esse processo é repetido até o argumento ser 0. Quando é 0, a função vai, finalmente, rodar o 'if'.
Note que o 'if' tem o 'return' que irá parar a função. E só para quando atinge 0 e mostra a letra da música do Europe.

Ou seja, os dois pontos obrigatórios da recursão: onde parar (no caso, quando for 0) e chamar a própria função, porém com argumento alterado em relação aquele que foi recebido.

Recursão é algo de extrema utilidade, pois trata casos de forma dinâmica. Ou seja, não importa o argumento, se for positvo, vai sempre executar a contagem regressiva. Recursão é alto de extrema de importância e uma maneira muito bonita de se resolver problemas.
No geral, exibe que bem menos código seja escrito, embora, no começo, pareça ser mais complicado.

Como exercício, sugiro que você crie uma função que calcule o fatorial de um númreo positivo.
Exemplo:
3! = 3x2x1= 6
4! = 4x3x2x1 = 24
5! = 5x4x3x2x1 = 120

Dica: fatorial de n pode ser visto como 'n x fatorial(n-1)', e fatorial de 1 é 1.

Nenhum comentário:

Veja também: