반복 - 루비

되풀이?



다시 정의할 수 있는 방법을 찾고 있습니다. Ou seja, quando uma função chama a si própria. Alguns exemplos bem comuns são os algoritmos da Sequência de Fibonacci e Calculo Fatorial.

Vamos ver alguns의 예:

1 - Somando os numeros de um array com 반복



Neste Exemplo iremos somar todos os numeros de um array utilizando Recursividade. Dado um array de numeros inteiros, vamos somar todos os itens e retornar o valor da soma.

def recursive_sum(numbers)
  if numbers.size <= 1
    numbers[0]
  else
    numbers.slice!(0) + recursive_sum(numbers)
  end

# Poderíamos fazer de forma ternaria:  
# numbers.size <= 1 ? numbers[0] : numbers.slice!(0) + recursive_sum(numbers)
end


Aqui fiz apenas uma verificação pra saber se o tamanho do array recebido é menor ou igual a 1, caso seja, retorne o Primeiro e único item do array. Caso o tamanho do array seja maior que 1, retorne uma soma do primeiro item do array mais uma nova chamada do método recursive_sum .

Então, pra entender melhor, vamos analisar o que acontece aqui utilizando um exemplo de um array [1, 2].

numbers = [1, 2]

recursive_sum(numbers)

# => 3


Naprimeira vez que o método for executado, o array possui 2 itens, 1 e 2. Ou seja, aprimeira condição será falsa e irá cair no else Porter Mais de um 아이템.

Nessa condição eu executo um slice!(0) , que por sua vez remove o Primeiro item do array, no caso o número 1 e chamo novamente a função soma_array, então algo como:
1 + soma_array([2])
E agora ao ser executada o array possui apenas um item, então a função retorna o numero 2, voltando ao contexto da primeira chamada da função:

`1 + 2

=> 3`



A mesma coisa acontece caso o array possua vários itens.

2 - 페이토리얼(n!)



Fatorial é um número natural inteiro positivo, o qual é Representativeado por n!

O fatorial de um número é calculado pela multiplicação desse número por todos os seus antecessores até chegar ao número 1. Note que nesses produtos, o zero (0) é excluído.

O fatorial é Representativeado por:

n! = n . (n – 1) . (n – 2) . (n – 3)!



Sabendo agora um pouco sobre fatorial, vamos escrever um metodo que execute isso de forma recursiva.

def factorial(number)
  if number == 1
    1
  else
    number * factorial(number - 1)
  end

  # number == 1 ? 1 : number * factorial(number - 1)
end


Então se utilizarmos o número 3 como parametro, teremos o seguinte:

factorial(3)

# => 6


Como nosso argumento é 3, 계산법 계산:

(3 * (3-1)) * (2-1)


3 - 시퀀시아 데 피보나치



Sequência de Fibonacci é a sequência numérica proposta pelo matemático Leonardo Pisa, mais conhecido como 피보나치:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Foi a partir de um problema criado por ele que o mesmo detectou a existência de uma regularidade matemática.

A sequência é definida mediante a seguinte formula:
Fn = Fn - 1 + Fn - 2
Trata-se do exemplo classico dos coelhos, em que Fibonacci descreve o crescimento de uma população desses animais.

Então, vamos criar esse ultimo exemplo em Ruby, lembrando que existem várias maneiras de transformar esses conceitos em codigo.

def fib(number)
  return number if number < 2
  fib(number-1) + fib(number-2)
  # number <= 1 ? number : fib(number - 1) + fib(number - 2)
end


Podemos ver que a condicional analisa se o número recebido é menor que 2, caso positivo, será retornado o próprio número, caso não, faça uma soma utilizando a mesma função a prime part 1 number, 2 como descrito na fórmula da sequência de Fibonnaci.

Então se utilizarmos o número 6 como parametro, teremos o seguinte:

fib(6)

# => 8


예를 들어, 계산적 계산을 수행할 수 있습니다. Se passarmos como parametro um número muito grande, por exemplo 11.000, provavelmente teremos um problema de estouro de pilha.

Para resolver este problema e conseguirmos executar o método de forma recursiva podemos usar como estratégia o TCO (Tail Call Optimization) , para saber mais a respeito eu escrevi este .

결론



Como vimos a recursão é algo bastante prático e basstante útil. E o caminho para entender melhor e dominar é a prática. Em breve teremos mais conteúdos e códigos usando este recurso.

연락:
이메일: [email protected]
링크드인:
Github: https://github.com/dnovais

좋은 웹페이지 즐겨찾기