在while循环中定义条件的不同方法。 (红宝石)

时间:2015-02-02 00:19:26

标签: ruby

我写了一个有效的功能。其中有一部分可以用另一种方式编写,但是编写它的替代方法不起作用,尽管它应该代表与我编写的原始代码相同的东西。我想知道为什么写它的替代方法不起作用。当我用替代代码运行它时,我认为它变成了无限循环,因为没有输出。

这是该函数的一个片段(有问题的代码被注释为“#ALTERNATIVE”,总共有四行):

if idx2 > idx 
  idx3 = idx2 - 1 
  while idx3 >= idx  #ALTERNATIVE 1: idx3 > idx
    if arr[idx3] > arr[idx]  
      return idx3
    elsif idx3 == idx #ALTERNATIVE 1: idx3 == idx + 1 or idx3 - 1 == idx
      return idx2
    end
    idx3 -= 1
  end
elsif idx > idx2 
  idx4 = idx2 + 1 
  while idx4 <= idx #ALTERNATIVE 2: idx4 < idx
    if arr[idx4] > arr[idx] 
      return idx4
    elsif idx4 == idx #ALTERNATIVE 2: idx4 == idx - 1 or idx4 + 1 == idx
      return idx2
    end
    idx4 += 1
  end
end   

2 个答案:

答案 0 :(得分:2)

如果idxidx21之内,则您的备用代码不起作用。

想象一下idx == 1idx2 == 2

if idx2 > idx 
  idx3 = idx2 - 1 # idx3 is equal to 1 and therefore equal to `idx`
  while idx3 > idx # this is false, the while loop is not run

没有任何回复。如果elsifidx == 2 idx2 == 1循环永远不会运行,while子句也会出现同样的情况。

答案 1 :(得分:0)

我不知道为什么替代代码不起作用,也许你已经放入idx2等于idx并退出。

但是,我认为向您展示如何更加惯用地编写此代码可能是谨慎的:

def furthest_number_higher_than_base(arr, base, start)
  range = start < base ? start..base : (base..start).to_a.reverse
  range.each { |i| return i if arr[i] > arr[base] }
  start
end