Я нахожусь в процессе обучения рубина, принимая Mooc Беркли, и, в некоторых из этих домашних заданий Mooc в нас есть упражнение, которое говорит:Как создать вложенный цикл с Ruby «Правильный путь!»?
Определить метод sum_to_n? который принимает массив целых чисел и дополнительное целое число n в качестве аргументов и возвращает true, если любые два элемента в массиве целых чисел суммируются с n. Пустой массив должен суммировать до нуля по определению.
Я уже создал два метода, которые могут выполнять эту работу, но мне не удобно ни с кем из них, потому что я думаю, что они не написаны на Ruby Way. Я надеюсь, что некоторые из вас могут помочь мне узнать, что будет правильным путем!
Первый метод, который я сделал использует метод each
для обоего итераций, но то, что я не люблю об этом методе является то, что каждое число суммируется с каждым другим номером, даже с тем же номером, делать что-то вроде этого:
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
Как вы можете видеть, существует много повторных сумм, и я не хочу этого.
Это код:
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
С другим методом, который я получил то, что хотел, только несколько сумм, не повторяя ни один из них или даже суммируя те же цифры, но это выглядит УЖАСНО, и я м уверен, что кто-то хотел бы, чтобы убить меня за то делать это таким образом, но метод делает большую работу, как вы можете увидеть:
arr[1, 2, 3, 4] => 1+2, 1+3, 1+4, 2+3, 2+4, 3+4
Это код:
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
Ну, надеюсь, вы, ребята, повеселились, делая лучший и красивый метод, как я пытался.
Благодарим за помощь.
Обычно, я бы устал от использования 'for' когда-либо в Ruby, но в этом случай, это приемлемо, поскольку второй метод будет иметь меньше итераций, чем использование 'each'. –
Хотя у Ruby есть 'for', мы склонны игнорировать его, потому что есть некоторые побочные эффекты, например, оставляя промежуточную переменную висящей вокруг, чтобы загромождать пространство переменных, и это заставляет нас перебирать контейнер, используя рассчитанные индексы, а чем позволять «каждому» передавать в каждом элементе индивидуально. Индексы, пропускающие первый или последний элемент или падающие с конца, являются общими ошибками на всех языках, и «каждый» помогает избежать этого. Таким образом, хотя это может показаться стилистическим выбором, это действительно выбор защитного программирования. И, добро пожаловать в переполнение стека! –
Аппетитно, «массовые открытые онлайн-курсы Беркли» порождают огромный интерес к SO =) –