我写了一个有效的功能。其中有一部分可以用另一种方式编写,但是编写它的替代方法不起作用,尽管它应该代表与我编写的原始代码相同的东西。我想知道为什么写它的替代方法不起作用。当我用替代代码运行它时,我认为它变成了无限循环,因为没有输出。
这是该函数的一个片段(有问题的代码被注释为“#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
答案 0 :(得分:2)
如果idx
和idx2
在1
之内,则您的备用代码不起作用。
想象一下idx == 1
和idx2 == 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
没有任何回复。如果elsif
和idx == 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