2015-06-29 2 views
2

Использование языка Ruby имеет функцию ArrayAdditionI (arr), которая принимает массив чисел, хранящихся в arr, и возвращает строку true, если любая комбинация чисел в массиве может быть добавлена ​​до равного наибольшему числу в массиве, иначе верните строку false. Например: если arr содержит [4, 6, 23, 10, 1, 3], вывод должен возвращать true, потому что 4 + 6 + 10 + 3 = 23. Массив не будет пустым, не будет содержать все те же элементы, и могут содержать отрицательные числа.Array Дополнение, зачем начинать с «i = 2»?

Может кто-нибудь объяснить мне, почему этот код начинается с «i = 2», а не «i = 0»?

def ArrayAdditionI(arr)  
    i = 2 

    while i < arr.length 
    return true if arr.combination(i).map{|comb| comb.inject(:+)}.include?(arr.max) 
    i += 1 
    end 

false 

end 

ArrayAdditionI(STDIN.gets) 

Поправьте меня, если я ошибаюсь, но с = 2, то цикл в то время как будет перебирать [2..4], а затем остановиться. Но позволяет ли это использовать все потенциальные комбинации? ... => работает код, поэтому, очевидно, это происходит, но я просто не вижу его.

+2

'i' используется как аргумент для' комбинация (i) '. Я предлагаю прочитать документы о [комбинационном методе] (http://ruby-doc.org/core-2.2.0/Array.html#method-i-combination). Какие комбинации, по вашему мнению, могут быть упущены этим методом/циклом? – spickermann

+0

Спасибо @spickermann, но я спросил, зачем начинать с «2» ... не то, что «я»? – Zarley

+0

'i' начинается с' 2' **, потому что ** это не индекс, он используется в 'arr.combination (i)'. Попробуйте 'arr.combination (0) .to_a' и' arr.combination (1) .to_a' и посмотрите, каков результат. –

ответ

1

i не является индексом массива, количество элементов, которое используется для создания комбинации. Поэтому, если максимальное число в массиве может быть сделано с суммой только двух элементов, оно останавливается, если не пытается три раза и так далее.

0

Вы не можете дать ему пустой массив, поэтому 0 ведет к ложному. Если у вас есть 1 элемент в массиве, это также бессмысленно. Поэтому я предполагаю, что 2 является отправной точкой, которая делает этот тест значимым.

1

array.combination(i) возвращает все возможные комбинации элементов в массиве длиной i.

Например если ar=[4, 6, 23, 10]

затем array.combination(2).to_a возвращается [[4,6],[4,23],[4,10],[6,23],[6,10],[23,10]]

Поэтому в основном вам нужно найти сумму в вашей программе и получить сумму требует сочетания длины двух (Вы должны операнды во всех возможная комбинация). Следовательно, вы не начинаете с i=0 или i=1.

Смежные вопросы