Soluzione Power

21 Feb 2017

Soluzione

# Proviamo a costruire la funzione in forma ricorsiva
# Se n = 0
#   allora ritorniamo [ [] ], che è il set di base
#   (questa è la strategia di uscita dalla ricorsione)
# Se invece n > 0 allora,
#   calcola l'insieme power(n - 1) (ricorsione)
#   prendi quella parte calcolata, e crea un nuovo
#   insieme identico al quale aggiungo solo il numero corrente n
#   unisco il vettore precedente al nuovo con n
def power(n)
  # Eseguo un controllo dell'input
  raise ArgumentError, "n deve essere un Fixnum" unless n.is_a? Fixnum

  # Implemento la strategia di uscita
  return [[]] if n == 0

  # Calcolo il risultato per tutte le condizioni
  # precedenti
  a = power(n - 1)
  # Uso la soluzione precedente per costruirne la
  # parziale nuova aggiungendo [n]
  # Array#map permette di costruire un nuovo array b
  # usando gli elementi e di a, modificati secondo
  # quanto specificato in un blocco
  b = a.map do |e|
    e + [n]
  end

  # Quello che ritorno come soluzione completa
  # è l'insieme delle precedenti con le successive
  return a + b
end