Soluzione Ricorrenza

21 Feb 2017

Soluzione Ricorrenze

def recurr( rec, ini, n )
  # Analizziamo i dati in ingresso. Rec, così come
  # ini è un Array di Numeric, quindi li possiamo analizzare
  # assieme (si potrebbe fare in modo più efficiente, ma per
  # ora facciamo così). n deve essere un Fixnum
  [rec, ini].each do |z|
    raise ArgumentError, "deve essere un Array" unless z.is_a? Array
    z.each { |k| raise ArgumentError, "deve contenere Numeric" unless k.is_a? Numeric }
  end
  raise ArgumentError, "deve essere un Fixnum" unless n.is_a? Fixnum
  # Dobbiamo sollevare un errore anche se la dimensione
  # del vettore di ricorrenza e di inizializzazione sono diverse.
  # Se fossero diverse infatti, ci sarebbe una incongruenza sulla
  # inizializzazione.
  raise ArgumentError, "rec e ini sono di dimensione diversa" unless rec.size == ini.size

  # Completato il check sui dati in ingresso andiamo
  # a costruire la nostra ricorrenza
  y = ini.dup
  q = y.size - 1

  # Questa parte di codice non fa altro che mimare quanto
  # scritto nelle istruzioni
  while q < n
    y[q+1] = 0
    # Questo ciclo for è come una sommatoria:
    # y[q+1] = rec[0] * y[q-0] + ... + rec[rec.size-1] * y[q-rec.size-1]
    for i in 0...rec.size
      y[q+1] += rec[i] * y[q-i]
    end
    # Aggiorniamo la dimensione di q
    q += 1
  end

  # Ritorniamo l'ultimo valore della ricorrenza.
  return y[-1]    
end