我有一个功能:
;; 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
将它转换为尾递归函数解决方案吗?如果是这样,任何想法将不胜感激。谢谢。
答案 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
。