def binarysearch(a, b, tofind, stringarray)
k=(a+b)/2
if a==b
return nil
end
if (stringarray[k]).include? tofind
return stringarray[k]
end
if (stringarray[k]<=>tofind)==1
binarysearch(a,k,tofind,stringarray)
end
if (stringarray[k]<=>tofind)==-1
binarysearch(k,b,tofind,stringarray)
end
if (stringarray[k]<=>tofind)==0
return stringarray[k]
end
end
Run Code Online (Sandbox Code Playgroud)
这是一种二进制搜索算法.a和b是它正在处理的数组索引,tofind是它正在搜索的字符串,而stringarray是一个字符串数组.不幸的是,每次我尝试运行此函数时,我都会收到以下语法错误:
undefined method `include?' for 1:Fixnum (NoMethodError)`
Run Code Online (Sandbox Code Playgroud)
但这不是一个固定点.我是Ruby的新手,所以我很容易错过一些明显的东西.有什么建议?
这是我声明stringarray的地方:( Netbeans说它是一个数组)
strings=Array.new
newstring=""
until newstring=="no" do
newstring=gets.chomp
strings[strings.size]=newstring
end
Run Code Online (Sandbox Code Playgroud)
这会将二进制搜索添加到所有数组:
class Array
def binarysearch(tf,lower=0,upper=length-1)
return if lower > upper
mid = (lower+upper)/2
tf < self[mid] ? upper = mid-1 : lower = mid+1
tf == self[mid] ? mid : binarysearch(tf,lower,upper)
end
end
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
(0..100).to_a.binarysearch(25)
=> 25
(0..100).to_a.binarysearch(-1)
=> nil
Run Code Online (Sandbox Code Playgroud)
或者从头开始指定下限和上限:
(0..100).to_a.binarysearch(25, 50, 100)
=> nil
Run Code Online (Sandbox Code Playgroud)