簡體   English   中英

紅寶石中二進制搜索算法的問題

[英]Problem with binary search algorithm in ruby

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

這是一個二進制搜索算法。 a和b是它正在處理的數組索引,tofind是它正在搜索的字符串,stringarray是一個字符串數組。 不幸的是,每次我嘗試運行此函數時,都會出現以下語法錯誤:

undefined method `include?' for 1:Fixnum (NoMethodError)`

但這不是一個fixnum。 我是Ruby的新手,所以我很容易錯過明顯的東西。 有什么建議嗎?

這是我聲明stringarray的地方:(Netbeans說這是一個數組)

  strings=Array.new
  newstring=""
  until newstring=="no" do
    newstring=gets.chomp
    strings[strings.size]=newstring
  end

這將二進制搜索添加到所有數組:

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

然后,您可以像這樣使用它:

(0..100).to_a.binarysearch(25)
=> 25
(0..100).to_a.binarysearch(-1)
=> nil

或者從一開始就指定您的上限和下限:

(0..100).to_a.binarysearch(25, 50, 100)
=> nil

傳遞給您的函數的stringarray實際上不是字符串數組,而僅僅是一個簡單的字符串。 在字符串上使用[]方法會返回給定位置的字符的字符代碼,即Fixnum。 因此stringarray [k]返回字符串中位置k處的字符的字符代碼。 並且如錯誤所述,Fixnum沒有include?

即使stringarray 字符串數組,我也不知道為什么要使用include?進行字符串比較include? include? 用於確定數組中是否存在項。 要比較字符串,只需使用==

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM