Sono nel processo di apprendimento Ruby, prendendo MOOC del Berkeley, e, in alcuni dei compiti di questi MOOC abbiamo un esercizio che dice:Come creare un ciclo annidato con Ruby "Right Way!"?
definire un metodo sum_to_n? che accetta un array di interi e un intero aggiuntivo , n, come argomenti e restituisce true se due elementi nella matrice di numeri interi sono pari a n. Un array vuoto deve sommare a zero per definizione.
Ho già creato due metodi che possono svolgere il lavoro, ma non mi sento a mio agio con nessuno di loro perché penso che non siano scritti in Ruby Way. Spero che alcuni di voi possano aiutarmi ad imparare quale sarebbe la strada giusta!
Il primo metodo che ho fatto utilizza il metodo each
per entrambe le iterazioni, ma quello che non mi piace di questo metodo è che ogni numero viene sommato ad ogni altro numero, anche con lo stesso numero, fare qualcosa di simile:
arr[1, 2, 3, 4] => 1+1, 1+2, 1+3, 1+4, 2+1, 2+2, 2+3, 2+4, 3+1, 3+2... 4+3, 4+4
Come potete vedere, ci sono un sacco di somme ripetute, e io non voglio quello.
Questo è il codice:
def sum_to_n?(arr, n)
arr.each {|x| arr.each {|y| return true if x + y == n && x != y}}
return true if n == 0 && arr.length == 0
return false
end
Con l'altro metodo ho ottenuto quello che volevo, a pochi somme senza ripetere uno di essi o anche sommando gli stessi numeri, ma sembra orribile, e io' m abbastanza sicuro che qualcuno piacerebbe uccidermi per fare in questo modo, ma il metodo fa un ottimo lavoro come si può vedere:
arr[1, 2, 3, 4] => 1+2, 1+3, 1+4, 2+3, 2+4, 3+4
questo è il codice:
def sum_to_n?(arr, n)
for i in 0..arr.length - 1
k = i + 1
for k in k..arr.length - 1
sum = arr[i] + arr[k]
if sum == n
return true
end
end
end
return true if n == 0 && arr.length == 0
return false
end
Bene, spero che voi ragazzi vi divertiate a fare un metodo migliore e più grazioso come ho provato.
Grazie per il vostro aiuto.
Normalmente, vorrei essere stanco di usare 'for' mai in Ruby, ma in questo caso, è accettabile in quanto il secondo metodo avrà meno iterazioni rispetto all'utilizzo di 'each'. –
Mentre Ruby ha 'for', tendiamo a ignorarlo perché ci sono alcuni effetti collaterali, come lasciare la sua variabile intermedia sospesa per ingombrare lo spazio variabile, e ci costringe a scorrere il contenitore usando gli indici calcolati, piuttosto che permettere a 'each' di passare in ogni oggetto individualmente. Gli indici che mancano del primo o dell'ultimo elemento, o che cadono alla fine, sono errori comuni in tutte le lingue e "ciascuno" aiuta ad evitarlo. Quindi, mentre * potrebbe * sembrare una scelta stilistica, è davvero una scelta di programmazione difensiva. E benvenuti a Stack Overflow! –
Appartently, "Massive Open Online Courses" di Berkeley stanno generando un enorme interesse per SO =) –