2015-10-29 153 views
1

該函數接收一個數字,並返回爲了表示二進制基數中的輸入數而需要「打開」的位數 。 例如,數字5在二進制中表示爲101,因此需要兩位「打開」。我需要知道我寫的函數是尾遞歸。如果沒有,我怎麼能把它變成尾遞歸?謝謝!這個Scheme是否函數尾遞歸?

我的功能:

(define (numOfBitsOn number) 
    (define (numOfBitsOn-2 number acc) 
     (if (> number 0) 
      (if (odd? number) 
       (numOfBitsOn-2(/(- number 1) 2) (+ acc (modulo number 2))) 
       (numOfBitsOn-2 (/ number 2) acc)) 
      acc)) 
    (numOfBitsOn-2 number 0)) 
+1

是的,它是尾遞歸的。 – uselpa

回答

3

DrRacket可以幫助您確定呼叫是否是尾部位置與否。點擊「語法檢查」按鈕。然後將鼠標指針移到問題表達式的左側圓括號中。在一個例子中我得到這樣的:

TCO example

紫色箭頭示出了表達在尾位置。

從手冊:

尾調用:在 尾位置任意子表達式,它是(語法)相對於它的包圍上下文由 註釋從尾部表達式繪製淺紫色箭頭到它的 周圍的表達式。

+0

坦克很多人! – Ohad121