2011-03-21 14 views
0

私はIS_VALID関数を渡す0と10000000の間の数値の範囲があり、このこのRubyバイナリ検索コードはなぜ機能しないのですか?

def search(begins, ends) 
    puts "Searching for #{begins}- #{ends}" 
    temp = ((begins + ends)/2).to_i 
    if is_valid? temp 
    if (ends - begins).abs < 3 # the result is between a and 2 digits than b 
     return temp # recursion ends 
    else 
     search(begins, temp) 
    end 
    else 
    search(temp, ends) 
    end 
end 

のようなコードを持っています。私はこのコードを使用してこの関数を渡す最初と最後の要素を検索したいが、それもclose.Itが無限ループに行くされていないことを仕事とここ

Searching for 0- 14981245 
Searching for 0- 7490622 
Searching for 3745311- 7490622 
Searching for 3745311- 5617966 # good result 
Searching for 3745311- 4681638 
Searching for 3745311- 4213474 
Searching for 3745311- 3979392 
Searching for 3745311- 3862351 
Searching for 3745311- 3803831 
Searching for 3745311- 3774571 
Searching for 3759941- 3774571 
Searching for 3759941- 3767256 
Searching for 3759941- 3763598 
Searching for 3759941- 3761769 
Searching for 3759941- 3760855 
Searching for 3760398- 3760855 
Searching for 3760626- 3760855 
+0

私は本当にあなたのコードを理解していません。あなたが(おそらく名詞を使用して)変数名を実装または明示しようとしているアルゴリズムを説明したなら、私はずっと助けることができるでしょう。 – Tom

+0

他の範囲内の同じ範囲を探したい。私は開始が例えば0から1000の間であることを知っています(このparamsは最初の関数呼び出しとは、範囲の開始が終わりのときに終わりを意味します)。この範囲(1000 + 0 /)2の中間の番号を見つけて、この番号が有効かどうかを確認したいと思うよりも、 「はい」の場合は、範囲番号の最初の数字が0と500になります(分割された範囲の左側のサイト)。いいえ、それが500と1000(分割された範囲の右側の場所)になければならない。私は有効な関数を渡す最初の数を得るまでこれをスキャンして分割したいと思います。 – John

+0

そして、この番号のtemp(私が探している範囲の最初の番号)を返す関数が必要です。この前に説明しないと申し訳ありません。 – John

答えて

0

ルックでの出力の数行ですいませんあなたが書いたコード:その中には、endsは、あなたが主張しているところで3745311の近くのどこにも存在しません。 3745311 + 7490622は11235933で、2で割った値はあなたが見ているように5617966になります。 5617966 - 3745311は3よりもはるかに大きいので、3745311 + 5617966(4681638)を計算します。

(begins + ends)/2ではなくを使用したかったと思います。それはあなたが予想している時点で3745311になるでしょう。

+0

もし私がUとしたら、私はこのことにこだわっていると言いました。3745311- 7490622 3745311- 7490622 – John

+0

を検索中です。私は間違いを犯してしまいました。結果は正しいです。 – John

関連する問題