Ruby - 当我认为它不应该循环时循环循环

时间:2014-04-30 16:50:57

标签: ruby while-loop

我在下面的代码中遇到了一些问题。这很简单,但对我来说最尴尬的是它确实有效。

这里我们有一个程序可以在先前输入的数组中随机播放项目,并将其打印到屏幕上。就是这样。

现在,为什么我这么奇怪? 全部归结为count变量,y变量和while loop。 我一步一步地向自己解释这段代码,但我不知道这个程序如何分析数组中的最后一项,以及所有由于

while y <= count
  x = rand(count+1)

  if array[x] != 'used'
    randomized.push array[x]
    array [x] = 'used'
    y = y + 1

  end

我只是不明白。如果我创建一个包含三个项目的数组 array = ["a","b","c"]然后变量count等于1。并且y变量在开头的最开始和结尾处等于0,我们将y增加1。这个while loop应该只重复两次,就像条件while y <= count一样,为什么?

首先我们的y0,而且它的数量小于1。所以我们先来了 走过我们的循环。 现在是时候进行第二次循环,y = 1count = 1,它们是平等的,我们走了。 现在它正在进行第三次演练。同时y = 2count = 1

有人能解释我怎么可能?

# starting condition
list = [ ]

# as the question
puts 'Enter a list of words, press \'enter\' to quit and they will be returned   
randomly shuffled.'
word = 'one'

# get the words in the first list
while word != ''
  word = gets.chomp
  list.push word
end

# define shuffle method
def shuffle array

  # starting conditions of local variables
  randomized = [ ]
  count = -2
  x = 0
  y = 0


  array.each do |word|
    count = count + 1
  end

  while y <= count    
    x = rand(count+1)    
    if array[x] != 'used'
      randomized.push array[x]
      array [x] = 'used'
      y = y + 1
    end
  end

  puts randomized

end

shuffle list

1 个答案:

答案 0 :(得分:0)

array = ["a","b","c"]计数为1是正确的。

但是,当你这样做时:

while word != ''
  word = gets.chomp
  list.push word
end

你真的得到array = ["a","b","c",""]。因此,计数实际上是2。

这不会导致以后出现问题,因为行x = rand(count+1)确保永远不会选择最后一个元素。