binary-search之Scheme實現

這裏有具體的討論,並配有C的代碼,https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/25.0.md 。二分查找有對數的複雜度,C++的標準庫中也實現了binary-search,具體的原理這裏就不說了,下面就談談算法的Scheme實現:

#!/usr/bin/guile -s
!#
(define (binary-search lst val)
   (define (helper left right)
      (if (> left right) (display "no value")
          (let* ((idx (quotient (+ left right  1) 2))
                 (mid (list-ref lst idx)))
         (cond ((= mid val) (display idx))
               ((> mid val) (helper left (- idx 1)))
               ((< mid val) (helper (+ idx 1) right))))))
      (helper 0 (- (length lst) 1)))

開頭的兩行是腳本語言中特有的,指定了執行腳本的程序,在主程序binary-search中內嵌了一個函數,首先判斷一下程序終止的條件,即當我們傳遞的參數中左下標都已經大於右下標還沒有找到時就說明val是不在序列中的,然後定義兩個局部變量方便程序書寫,在cond中選擇程序的執行路徑,若此次沒有找到那麼就遞歸的執行算法。這裏思路是和函數式編程的思想是一致的。

這裏注意let*的用法,因爲mid的取值需要依賴idx,所以這裏如果用let編譯器將會報錯,抱怨idx是一個沒有約束的變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章