2011-03-03 8 views
0
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 
+6

ちょうど注記:RubyはCではありません。上記は有効なプログラムですが、それはあいまいで複雑です。 Rubyを学ぶことの半分は、表現力豊かなよく考えられたコードを書くことを学んでいます。あなたがここでそれをしていたら、あなたはこの問題にぶつからないだろうと思う。 Russ LousonによってEloquent Rubyをチェックしてください。 – coreyward

+0

上記のコードをRubyierの方法で書き直しました:http://voidptr.heroku.com/pastes/83c179d6feb470fe12cca09811190aea4d8db53b。まだ動作しませんが、Rubyコードが通常どのように見えるかがわかります。楽しむ! –

+2

この問題を示すサンプル配列と呼び出しを提供してください。明らかに 'stringarray [k]' _はFixnumです。 – Phrogz

答えて

0

あなたの関数に渡されstringarrayが実際に文字列の配列が、ちょうど単純な文字列ではありません。文字列の[]メソッドを使用すると、指定された位置にある文字の文字コードがFixnumとして返されます。 stringarray [k]は、文字列の位置kにある文字の文字コードを返します。そしてエラーが示すように、Fixnumにはinclude?がありません。

文字列の配列だったとしても、文字列の比較をinclude?とする理由はわかりません。 include?は、アイテムが配列内に存在するかどうかを調べるためのものです。文字列を比較するには、==を使用してください。

+2

'[]' **メソッドを使うことに注意してください**文字列では、そのインデックスの文字をRuby 1.9(1.8のような文字コードではなく)で返します。 – coreyward

+0

'[]'はメソッドであり、演算子ではありません。 –

+0

ええ、私はこの用語をゆるやかに使用しています。ピックアックス・ブックでさえ、それらを演算子および方法として参照しています。私はそれを修正するでしょう。 – johusman

5

これは、すべてのアレイにバイナリ検索を追加します。

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 
関連する問題