2014-02-24 67 views
1

我創建了一個名爲「Sum_plus_one」的方法,該方法接受包含整數的數組參數。在向它們中的每一個添加一個之後,該方法應該返回數組中整數的總和。將1添加到數組的每個元素

例如: sum_plus_one([1,2,3])

結果應該是:9

我的代碼看起來是這樣的

def sum_plus_one(*nums) 

    for num in nums 
    num + 1 
    end 
    total = 0 
    for num in nums 
    total += num 
    end 
return total 
end 
+1

'num + 1'對陣列的內容沒有影響。 – akonsu

+0

感謝您的回覆我仍然是Ruby中的新手 – user3344741

回答

1

的map/reduce在這裏派上用場:

def sum_plus_one(nums) 
    nums.map(&:succ).reduce(:+) 
end 

編輯:

這裏是一個辦法讓你的代碼有效:

def sum_plus_one(nums) 
    nums.map! do |num| 
    num + 1 
    end 

    total = 0 
    for num in nums 
    total += num 
    end 

    return total 
end 
+0

你打敗了我! – matt

+0

哇,它真的幫助我很多,但地圖功能呢? – user3344741

+0

map是一個迭代器。它根據塊中的代碼('do | num | num + 1 end')更改數組中的每個元素。在這種情況下,它將數組中的每個元素加1。我們傾向於在Ruby中使用迭代器。它減輕了我們對i和j的追蹤,並使得代碼乾淨,簡潔,靈活。查看上面的map/reduce示例以進行比較。 – seph

1

Enumerable#inject使用

[105] pry(main)> arr 
=> [1, 2, 3] 
[106] pry(main)> arr.inject(0) { |var, i| var + i + 1 } 
=> 9 

所以該方法看起來像

def sum_plus_one(*nums) 
    nums.inject(0) { |var, num| var + num + 1 } 
end 
+2

只需返回'var + num + 1'而不將其分配給'var'就足夠了。 – akonsu

0

而不是每個添加1然後將它們添加在一起,您可以將它們添加在一起,然後添加計數。

for i in (0..nums.count) 
    total += nums[i] 
end 
total += nums.count 

感謝akonsu爲我清理一些細節。

+0

這不會幫助 – akonsu

+0

你能解釋一下爲什麼嗎?我的紅寶石與過去相比有點生疏,謝謝讓我知道它不會。 –

+0

它不會工作,因爲它會增加變量num,但它不會對陣列產生任何影響。 – akonsu

0

您的問題是您需要將您的num + 1值分配給您在第一個循環中枚舉的數組的相應元素。

也許是這樣的:

for i in (0...nums.count) 
    nums[i] += 1 
end 

後,你的程序應該工作

(是的,你可以使用花哨的圖書館或構建的,而不是上面的循環)

請注意,您可以消除頂部循環,只需在第二個循環中將num + 1添加到您的total即可。

1

功能語版

[1, 2, 3].reduce(0) {|acc, n| acc + n + 1} 
5

爲什麼不能做數學的一點點事先並看到求和數組元素加一個相同總結的元素,然後加入數組的長度?例如:

(5+1) + (6+1) + (11+1) = 5 + 6 + 11 + (1 + 1 + 1) 
         = 5 + 6 + 11 + 3 

這給你的東西很好的和簡單的:

array.inject(:+) + array.length