# For example, the base [1, 4, 6] gives us the following pyramid
# 15
# 5 10
# 1 4 6
def pyramid_sum(base)
pyramid = [base]
new_level = []
prev_level = []
base.length.times { |x|
prev_level = pyramid[0]
new_level = build(prev_level)
pyramid.unshift(new_level)
}
return pyramid
end
def build(level)
new_level = []
level.each_with_index { |num, index|
if index < level.length-1
new_level <<level[index] level[index 1]
end
}
return new_level
end
print pyramid_sum([1, 4, 6]) #=> [[15], [5, 10], [1, 4, 6]]
puts
print pyramid_sum([3, 7, 2, 11]) #=> [[41], [19, 22], [10, 9, 13], [3, 7, 2, 11]]
puts
輸出:** [[], [15], [5, 10], [1, 4, 6]] [[], [41], [19, 22], [10, 9, 13], [3] , 7, 2, 11]] **
為什么二維陣列前面總是多出一個[](空陣列)?我在 Ruby 陣列的結果中已經多次看到這種情況,雖然這很簡單,但我似乎無法弄清楚為什么那個額外的煩人的陣列總是存在?我知道這很簡單,如果有必要,我可以洗掉這個問題,但為什么我的陣列前面有一個額外的陣列元素?似乎只是創建一個陣列,因為它總是有一個額外的元素,我不能“真正”修改它,因為無論如何 Ruby 中的所有東西都是一個物件。
uj5u.com熱心網友回復:
作為第一步,我重新格式化了您的代碼并洗掉了一些無用的代碼。(例如,對new_level和prev_levelin的賦值pyramid_sum是無用的,因為無論如何它們都會立即在塊中重新賦值。)
def pyramid_sum(base)
pyramid = [base]
base.length.times do
prev_level = pyramid.first
new_level = build(prev_level)
pyramid.unshift(new_level)
end
pyramid
end
def build(level)
new_level = []
level.each_index do |index|
if index < level.length - 1
new_level << level[index] level[index 1]
end
end
new_level
end
洗掉那些無用的分配后,產生問題的兩行就在彼此的下面,問題幾乎已經跳出來了:
- 金字塔的高度應始終與底部的寬度相同。
- 您使用原始基數作為金字塔的第一層來預初始化結果變數。
- 但是隨后您迭代
build方法base.length次數,即除了您預先初始化的一層之外,您還添加了另一層base.length……結果,您最終得到的一層太多了:您可以根據需要構建盡可能多的層,但已經在結果中加入了另一個層次。
解決方案很簡單:迭代base.length - 1次數:
def pyramid_sum(base)
pyramid = [base]
(base.length-1).times do
prev_level = pyramid.first
new_level = build(prev_level)
pyramid.unshift(new_level)
end
pyramid
end
def build(level)
new_level = []
level.each_index do |index|
if index < level.length - 1
new_level << level[index] level[index 1]
end
end
new_level
end
請注意,這個問題幾乎尖叫了遞回。像這樣的東西:
def pyramid_sum(*base) = pyramid_rec([base]).reverse
def pyramid_rec(pyramid)
return pyramid if pyramid.last.size <= 1
pyramid_rec(pyramid << pyramid.last.each_cons(2).map(&:sum))
end
puts pyramid_sum(1, 4, 6)
puts pyramid_sum(3, 7, 2, 11)
uj5u.com熱心網友回復:
在開始時獲得額外的空陣列的原因是因為您告訴pyramid_sum函式向基礎添加base.length更多級別。
以這種方式構成的金字塔的層數與其底部的專案數一樣多。
所以這意味著當您撰寫 時base.length.times { |x| ... },您實際上是在說您將在基本級別之上添加base.length新的額外級別。
對于您的第一個示例 ,[1, 4, 6]這意味著您說在此基礎層之上,您將再添加三個層:
- 首先,您將分部總結基礎層,添加
[5, 10] - 其次,您將分部分總結新的第二層,添加
[15] - 最后,您將嘗試分部分總結第三層,這將導致
[]
原因是當您嘗試對第三層求和時,其中沒有足夠的項來添加下層的任意兩個數字。因此,您最終將添加new_layer = []尚未修改的空白。
如果你想解決這個問題,你可以運行迭代(base.length - 1).times,或者你可以添加一個if陳述句作為保護,不添加任何生成的空層:
new_level = build(prev_layer)
if new_level.length > 0
pyramid.unshift(new_level)
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/396594.html
