2013-09-24 38 views
0

我面临的发展在Ruby中,参照有效的二进制搜索算法的一些问题this site
二进制搜索返回错误的值

正确答案:返回一个值-1432
接收的答案:

代码如下:

def bsearch(a, k) 

lower = 0 
upper = a.length-1 

while a[upper].to_f> k.to_f and a[lower].to_f< k.to_f 
    low_diff = k.to_f -a[lower].to_f 
    range_diff = a[upper].to_f-a[lower].to_f 
    count_diff = upper-lower 
    range = ((low_diff/range_diff) * (count_diff)) + lower 

    if k.to_f > a[range].to_f 
     lower = range+1 
    elsif k.to_f < a[range].to_f 
     upper =range-1 
    else  
     lower = range 
    end 
end 
if k =a[lower] 
    return lower 
else 
    return nil 
end 
end 

请帮我摆脱逻辑。

+2

你知道['阵列#bsearch'(http://www.ruby-doc.org/core-2.0.0/Array.html#method-i-bsearch)你不是吗? – Stefan

回答

0

像@vacawama说使用==,而不是=去年if条件:

if k == a[lower] 

而且在while条件下使用&&代替and

while a[upper].to_f > k.to_f && a[lower].to_f < k.to_f 

我对这个代码的输出:

more ./bsearch.rb 
#!/usr/bin/ruby 
def bsearch(a, k) 
    lower = 0 
    upper = a.length-1 
    while a[upper].to_f > k.to_f && a[lower].to_f < k.to_f 
     low_diff = k.to_f - a[lower].to_f 
     range_diff = a[upper].to_f - a[lower].to_f 
     count_diff = upper-lower 
     range = ((low_diff/range_diff) * (count_diff)) + lower 
     if k.to_f > a[range].to_f 
      lower = range + 1 
     elsif k.to_f < a[range].to_f 
      upper = range - 1 
     else  
      lower = range 
     end 
    end 
    if k == a[lower] 
     return lower 
    else 
     return nil 
    end 
end 

puts bsearch([1, 2, 3, 4, 5], 3) 

是一个:

./bsearch.rb 
2.0