在Scheme中将递归函数转换为尾递归函数

时间:2012-03-12 19:01:47

标签: binary integer scheme bits

我有一个功能:

;; Converting list of integers to a bit string
(define (convert-integers-to-bits integer-representation-of-bits)
  (if (null? integer-representation-of-bits)
    '#*
    (bit-string-append 
      (convert-integers-to-bits (cdr integer-representation-of-bits))
      (unsigned-integer->bit-string 1 (car integer-representation-of-bits)))))

当我在小型列表上运行它时,它可以工作,但在真实文件中,它会给我警告:

;Aborting!: maximum recursion depth exceeded

样本用法:

]=> (convert-integers-to-bits '(1 1 0 1 0 1))
;Value: #*110101

将它转换为尾递归函数解决方案吗?如果是这样,任何想法将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:3)

我的一个朋友解决了它,粘贴以备将来查询:

(define (convert-integers-to-bits integer-representation-of-bits)
   (define (accum rest so-far)
     (if (null? rest)
       (bit-string-append so-far '#*)
       (accum   
         (cdr rest)      
         (bit-string-append     
           (unsigned-integer->bit-string 1 (car rest))
           so-far))))                               
    (accum integer-representation-of-bits '#*))

答案 1 :(得分:1)

是的,将其转换为尾递归将解决问题。在这种情况下,最好的方法是使用累加器。这是您传递的值,表示您已经完成的计算,或者您还剩下什么。例如,您可以传递到目前为止生成的位串,然后在结束时执行append