2011-03-21 68 views
0

我有這樣爲什麼這個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 

代碼有0和千萬該傳遞函數is_valid之間的數字的範圍。我想找到使用此代碼通過這項功能,第一和最後一個元素,但它不工作,它甚至沒有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 2011-03-21 23:11:28

+0

我想找到其他範圍內的相同範圍。我知道開始是介於例如0和1000之間(我用第一次調用的這個參數函數在範圍開始時結束時開始平均值)。比我想在這個範圍(1000 + 0 /)2找到中間數字,並檢查這個數字是否合格。如果是,那麼意味着我的第一個號碼範圍號碼位於0和500(在左側站點od劃分的範圍內)。如果不是,它必須在500和1000(劃分的範圍的右邊)。我想掃描和分割這個,直到我得到了第一個通過我的有效函數的數字。 – John 2011-03-22 09:30:13

+0

而我想要函數返回這個數字temp(我正在搜索的範圍的第一個數字)。對不起,不解釋此前 – John 2011-03-22 09:31:11

回答

0

查看輸出的幾行您所寫的代碼:在您聲明的位置,任何內容都不會導致ends在3745311附近的任何地方。 3745311 + 7490622是11235933,除以2,就像你看到的那樣,給我們5617966。 5617966 - 3745311遠大於3,因此它計算出3745311 + 5617966,即4681638 - 就像您看到的一樣。

我想也許你想使用ends/2而不是(begins + ends)/2。這會導致它在您期望的點上是3745311。

+0

如果我做爲U說我卡住這個搜索3745311- 7490622 正在搜索3745311- 7490622 – John 2011-03-21 19:57:59

+0

對不起,我的錯誤,我想找到一箇中間的一條線開始在一個和結束在B所以結果是正確的。 – John 2011-03-21 20:21:45

相關問題