在数组中添加不提供正确输出的奇数
我的一个ruby程序检测数组中的奇数并将它们相加并不能提供正确的输出。鉴于我正在学习ruby,这是一个逻辑错误,我不能轻易推断我犯了什么错误。 这里是代码:在数组中添加不提供正确输出的奇数
def odd_sum(numbers)
index = 0
result = 0
while index < numbers.length
if (numbers[index] % 2 != 0)
result += 1
end
index +=1
return result
end
end
puts odd_sum([1,2,4,5,7,9]) currently my output is 1 should be 22
puts odd_sum([0,6,4,4]) currently output 0
puts odd_sum([1,2,1]) currently output 1 should be 2
问题:为什么我的输出错误?任何方式使这个更清洁或更好? 我正在cloud9上运行一个名为oddball.rb的程序。
看看你的if语句:结果+ = 1,不要加1,但添加了目前正在测试的数量:结果+ =号[指数]
矽统
return result
会导致代码在那里和那里退出......它只会添加第一个数字,然后永远退出整个方法......它永远不会查看数组的其他元素。
现在已经正确缩进你的代码,你可以看到这行是在while循环中的...... 可能你希望它在while循环之外......当你看到这种bug时更容易正确缩进你的代码。你应该总是缩进你的代码......在你遇到像这样的错误之前,它似乎并不重要......它总是很重要。现在开始是一个好习惯。 ;)
def odd_sum(numbers)
index = 0
result = 0
while index < numbers.length
if (numbers[index] % 2 != 0)
result += 1
end
index +=1
return result
end
end
puts odd_sum([1,2,4,5,7,9]) currently my output is 1 should be 22
puts odd_sum([0,6,4,4]) currently output 0
puts odd_sum([1,2,1]) currently output 1 should be 2
上线result += 1
,你添加的每个有奇数,所以它不是一个总和,而是一个计数时间1
。
在行return result
上,程序在遇到return
时会立即结束。因此,由于第一个数组中的第一个数字是奇数,程序会将结果递增1,然后返回结果。
你想要做的是result += numbers[index]
,并在while循环结束时返回结果。
在Ruby中,通常有更好的方法来做事情,而循环是指当你不知道你循环了多少次。在这种情况下,你确切知道有多少次,所以我会建议使用迭代器。
def odd_sum(numbers)
result = 0
numbers.each do |num|
result += num if num.odd?
end
end
甚至更好
def odd_sum(numbers)
numbers.select(&:odd?).reduce(&:+)
end
我最初的想法是“甚至更好”并不是更好,因为它需要两次通过阵列。但经过反思,我同意你的看法,因为'select'和'reduce'都是用C编写的,所以它可能比你的第一种方法更快。将其分解为两个连续的操作也使调试和测试变得更加容易。注意你可以写'.reduce(:+)'。 (请参阅文档) –
不要介意你的缩进,否则真的很难看到是错误的。 – Aetherus