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 minMax e 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

  1. A função minMax é declarada com dois valores de retorno: (int, int).
  2. Inicializamos min e max com o primeiro elemento do slice, pois o slice nunca está vazio.
  3. Percorremos nums[1:] (do segundo ao último) para comparar cada elemento.
  4. Se o elemento for menor que min, atualizamos min; se for maior que max, atualizamos max.
  5. No final, retornamos os dois valores com return min, max.
  6. No main, usamos atribuição múltipla min, max := minMax(...) para capturar os dois retornos.
  7. Imprimimos com fmt.Printf no 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 min com 0, o resultado pode ficar errado para slices só com positivos. Use nums[0].
  • Retornar apenas um valor: return min causa 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