在数组中添加不提供正确输出的奇数

问题描述:

我的一个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的程序。

+1

不要介意你的缩进,否则真的很难看到是错误的。 – Aetherus

看看你的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 
+0

我最初的想法是“甚至更好”并不是更好,因为它需要两次通过阵列。但经过反思,我同意你的看法,因为'select'和'reduce'都是用C编写的,所以它可能比你的第一种方法更快。将其分解为两个连续的操作也使调试和测试变得更加容易。注意你可以写'.reduce(:+)'。 (请参阅文档) –