Ruby:在数组中避免无限循环,使每个数字加倍

时间:2017-04-02 04:59:28

标签: ruby

所以这里有一个infinte循环,但我没有看到它。

# Return an array that doubles each number
numbers = [1, 2, 3, 4]
numbers.each do |number|
  numbers << number * 2
end
puts numbers

我知道有更短的方法可以做到这一点,但我正在学习所有这些都是更明确地写出来的。

5 个答案:

答案 0 :(得分:5)

您在迭代该数组时向数组添加元素。这是therefore impossible to reach the end

您需要做的是使用int *功能:

map

使用其值乘以2更新每个条目。

如果您想添加一组加倍的数字:

numbers.map! do |n|
  n * 2
end

这会增加一个已加倍的数组副本。

修改:出于学术插图的目的,您可以尝试使用numbers += numbers.map do |n| n * 2 end 的副本,而不是使用map

dup

您也可以按顺序迭代它:

numbers.dup.each do |n|
  numbers << n * 2
end

numbers.each_index do |i| numbers << numbers[i] * 2 end 版本相比,它们效率低得多且难以阅读。

答案 1 :(得分:1)

你无法看到这个过程,因为这个无限永远存在,永远不会达到你的puts numbers陈述。这就是为什么你不能在控制台中看到它。

尝试类似:

numbers = [1, 2, 3, 4]
numbers.each do |number|
  numbers << number * 2
  puts numbers
end

看到你的电脑疯了:)

答案 2 :(得分:0)

通过按下数组中的doubled值,每次增加数组大小为1.因此发生无限循环。我想你真正想做的是

numbers.each do |num|
  puts num *2
end

答案 3 :(得分:0)

  

返回一个数字加倍每个数字

假设您不想使用map,可以使用Enumerable#each_with_object

numbers = [1, 2, 3, 4]
numbers.each_with_object([]) { |n, o| o << n + n }
#=> [2, 4, 6, 8]

答案 4 :(得分:0)

由于没有人提到明显的答案,这里是:

numbers = [1, 2, 3, 4]
double_numbers = []
numbers.each do |number|
  double_numbers << number * 2
end
p double_numbers
# [2, 4, 6, 8]

如果您不了解mapmap!,这将是您的方法。请注意,您迭代一个数组并创建另一个数组,以避免弄乱each循环。