Se quiser copiar o código do PIX:

00020126580014BR.GOV.BCB.PIX013643c5f950-535b-4658-b91f-1f1d135fe4105204000053039865802BR5925Antonio Cavalcante de Pau6009SAO PAULO61080540900062070503***6304946B

Aula 17 - Tutorial Golang - Recursão

Recursão

Em ciência da computação, a recursão é uma forma de resolver problemas em que a solução depende de soluções de instâncias menores do problema maior. Esses problemas geralmente podem ser resolvidos por iteração, mas é necessário identificar e indexar as instâncias menores no momento da programação. A recursão resolve esses problemas usando funções que chama a si mesma de dentro de seu próprio código. A abordagem pode ser aplicada a muitos tipos de problemas, e a recursão é uma das ideias centrais da ciência da computação. Go oferece suporte a funções recursivas. Vamos a um exemplo clássico do fatorial de um número. Essa função de fato chama a si mesma até atingir o caso base de fato (0).

func fact(n int) int {
    if n == 0 {
        return 1
    }
    return n * fact(n-1)
}
Na primeira o n é 5, e como ele não sabe o resultado ele chama com n - 1 = 4, só que a função ainda não tem como saber o fatorial de 4, então a função é chamada mais uma vez, agora com 3. E assim vai até chegar o caso base, que é o 1. Como no caso base a função sabe o resultado, que é 1, ela retorna para chamada anterior, a do n = 2, fazendo: n * fact(n-1) = 2 * 1 = 2, que é o resultado da chamada do n = 2, aí então esse 2 de resultado é retornado para a chamada da 3, fazendo 2 * 3 = 6, e assim vai até desempilhar todas as chamadas e ter o resultado final do fatorial do n inicial.

Na aula https://www.codigofluente.com.br/aula-06-subsequencia-comum-mais-longa-lcs/ tem uma explicação mais detalhada.

Recursão com Closure

Os closures também podem ser recursivas, mas, isso requer que ela seja declarada com uma var digitada explicitamente antes de ser definida. Exemplo de recursão usando closure, isto é, função anônima, para achar o n-ésimo número da sequência de Fibonnaci.

//declara uma variável do tipo função anônima(closure)
//que recebe um parâmetro do tipo inteiro e retorna um inteiro
var fib func(n int) int
//usa a variável criada anteriormente para receber o retorno
//da implementação da função anônima fib
fib = func(n int) int {
  if n < 2 {
    return n
  }
  return fib(n-1) + fib(n-2)
}
O código acima tá dentro da função main().

Código completo


package main

import "fmt"

func fact(n int) int {
    if n < 2 {
        //caso base
        return 1
    }
    return n * fact(n-1)
}

func main() {
    //declara uma variável do tipo função anônima(closure)
    //que recebe um parâmetro do tipo inteiro e retorna um inteiro
    var fib func(n int) int
    //usa a variável criada anteriormente para receber o retorno
    //da implementação da função anônima fib
    fib = func(n int) int {
        if n < 2 {
            return n
        }
        return fib(n-1) + fib(n-2)
    }
    //imprime os resultados
    fmt.Println("O fatorial de 7 é:", fact(7))
    fmt.Println("O sétimo número da sequência de Fibonnaci é:", fib(7))
}

E pra executar é só entrar na pasta onde tá o arquivo recursion.go e digitar:

go run recursion.go

É isso pessoal, fico por aqui.

Página principal do blog

página do Código Fluente no Facebook

Esse é o link do código fluente no Pinterest

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Obrigado e bons estudos. ;)