def adjacent_sum(arr)
narr = []
arr.each.with_index do |num, index|
narr << (arr[index] arr[index 1])
end
return narr
end
print adjacent_sum([3, 7, 2, 11])
#=> [10, 9, 13], because [ 3 7, 7 2, 2 11 ]
adjacent_sum([2, 5, 1, 9, 2, 4])
#=> [7, 6, 10, 11, 6], because [2 5, 5 1, 1 9, 9 2, 2 4]
我正在嘗試根據用戶的輸入修改 narr。基本上試圖讓所有相鄰的數字相加并回傳一個新陣列。
撰寫一個方法 next_sum ,它接受一個數字陣列并回傳一個包含原始陣列中相鄰數字之和的新陣列。請參閱示例。
我是 Ruby 及其思維方式的新手。我不知道針對這個問題使用哪種迭代方法,我知道有很多迭代方法。我可以走老路,只做一個 while 回圈,但我想了解 .each 回圈的機制。
這是錯誤訊息:
/tmp/file.rb:5:in ` ': nil can't be coerced into Integer (TypeError)
from /tmp/file.rb:5:in `block in adjacent_sum'
from /tmp/file.rb:3:in `each'
from /tmp/file.rb:3:in `with_index'
from /tmp/file.rb:3:in `adjacent_sum'
from /tmp/file.rb:10:in `<main>'
uj5u.com熱心網友回復:
您的回圈正在迭代串列的每個元素。讓我們以你的第一個例子為例。
[3, 7, 2, 11]
好的,我們正在迭代。首先,我們點擊了 3(我們添加了 7,因為它是下一個)。接下來,我們擊中了 7(我們將向其添加 2)。第三,我們命中 2(加 11)。最后,我們達到了 11,我們要添加什么?我們正在添加arr[4],它不存在,因此您的錯誤。
each(及其所有的許多變體)從根本上說,你正在做的概念操作每一個基礎串列的元素。在您的情況下,您需要除最后一個元素之外的所有元素,因為您需要能夠添加“下一個”元素才能執行添加。您可以像這樣顯式跳過最后一個元素
arr.each.with_index do |num, index|
if index < arr.size - 1
narr << (arr[index] arr[index 1])
end
end
但這并不比直線while回圈好。Ruby 的所有可列舉方法的重點是為作業選擇正確的工具,而在這種情況下,Ruby 的Enumerable只有該工具。each_cons為您提供 N 個相鄰元素集合的滑動視窗。所以我們可以寫
def adjacent_sum(arr)
arr.each_cons(2).map { |x, y| x y }
end
這就是 RubyEnumerable模塊的強大之處。一旦你有了一個理解迭代的高級構造,它就會提供大量的工具來智能地迭代資料結構,這就是為什么它比普通while回圈更有益。
uj5u.com熱心網友回復:
def adjacent_sum(arr)
narr = []
l = arr.length
arr.each.with_index do |num,index|
if index < arr.size-1
narr << arr[index] arr[index 1]
end
end
return narr
end
print adjacent_sum([3, 7, 2, 11]) #=> [10, 9, 13], because [ 3 7, 7 2, 2 11 ]
puts
print adjacent_sum([2, 5, 1, 9, 2, 4]) #=> [7, 6, 10, 11, 6], because [2 5, 5 1, 1 9, 9 2, 2 4]
puts
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/391215.html
下一篇:選股練習中的減少方法?
