Fácil Go
Múltiplos retornos: minMax
Enunciado
Escreva uma função minMax que recebe um slice de inteiros e retorna o menor e o maior valor. Considere que o slice nunca está vazio. No main, chame a função com []int{3, 1, 4, 2} e imprima os valores no formato min=1 max=4.
Requisitos
- A função deve se chamar
minMaxe retornar dois inteiros. - Deve usar múltiplos retornos na assinatura e no
return. - A saída deve ser exatamente
min=1 max=4.
Código inicial
package main
import "fmt"
// minMax retorna o menor e o maior valor do slice.
func minMax(nums []int) (int, int) {
// implemente
}
func main() {
// chame minMax e imprima
}
Saída esperada
min=1 max=4
Ver dica
Inicialize min e max com o primeiro elemento do slice e percorra os demais comparando.
Mostrar solução
package main
import "fmt"
// minMax retorna o menor e o maior valor do slice.
func minMax(nums []int) (int, int) {
min, max := nums[0], nums[0]
for _, n := range nums[1:] {
if n < min {
min = n
}
if n > max {
max = n
}
}
return min, max
}
func main() {
min, max := minMax([]int{3, 1, 4, 2})
fmt.Printf("min=%d max=%d\n", min, max)
}
Passo a passo
- A função
minMaxé declarada com dois valores de retorno:(int, int). - Inicializamos
minemaxcom o primeiro elemento do slice, pois o slice nunca está vazio. - Percorremos
nums[1:](do segundo ao último) para comparar cada elemento. - Se o elemento for menor que
min, atualizamosmin; se for maior quemax, atualizamosmax. - No final, retornamos os dois valores com
return min, max. - No
main, usamos atribuição múltiplamin, max := minMax(...)para capturar os dois retornos. - Imprimimos com
fmt.Printfno formato pedido.
Por que funciona
A função retorna dois valores inteiros, e o chamador os recebe em duas variáveis distintas. Isso evita ter que criar uma struct ou usar ponteiros para retornar mais de um resultado. O laço percorre todos os elementos e mantém as extremidades corretas.
Erros comuns
- Esquecer de tratar o primeiro elemento: se inicializar
mincom0, o resultado pode ficar errado para slices só com positivos. Usenums[0]. - Retornar apenas um valor:
return mincausa erro de compilação, pois a assinatura exige dois valores. - Ignorar um dos retornos:
min, _ := minMax(...)funciona, mas se precisar dos dois, use ambos.
Outra forma de resolver
Usar retornos nomeados:
func minMax(nums []int) (min, max int) {
min, max = nums[0], nums[0]
for _, n := range nums[1:] {
if n < min { min = n }
if n > max { max = n }
}
return
}
É preferível quando os nomes dos retornos ajudam a documentar a função.
Saída esperada
min=1 max=4