这个Scheme函数尾递归吗?

时间:2015-10-29 18:19:52

标签: recursion scheme tail-recursion bits

该函数接收一个数字并返回原来的位数 要求“打开”以表示二进制基数中的输入数字。 例如,数字5以二进制表示为101,因此需要两个比特为“开”。我需要知道我写的函数是否是尾递归。如果没有,我怎么能把它变成尾递归?谢谢!

我的功能:

(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 个答案:

答案 0 :(得分:3)

DrRacket可以帮助您确定呼叫是否处于尾部位置。单击“语法检查”按钮。然后将鼠标指针移动到相关表达式的左括号。在一个例子中,我得到了这个:

TCO example

紫色箭头表示表达式处于尾部位置。

从手册:

  

尾调用:任何(语法上)的子表达式   关于其封闭上下文的尾部位置由注释   从尾部表达到它的一个浅紫色箭头   周围的表达。