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

Binary 在Scheme中将递归函数转换为尾部递归函数,binary,integer,scheme,bits,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-represe

我有一个功能:

;; 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

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

是的,将其转换为尾部递归将解决问题。在这种情况下,最好的方法是使用蓄能器。这是一个您传递的值,表示您已经完成的计算,或者您还需要完成的计算。例如,您可以传递到目前为止生成的位字符串,然后在结束时执行
追加操作。

是的,将其转换为尾部递归将解决问题。在这种情况下,最好的方法是使用蓄能器。这是一个您传递的值,表示您已经完成的计算,或者您还需要完成的计算。例如,您可以传递到目前为止生成的位字符串,然后在结束时执行
追加操作。

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

(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 '#*))

我的一位朋友解决了这个问题,并粘贴了以下内容以备将来查询:

(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 '#*))

@好电话:)。我刚试过,但上面说我得等两天。另外,谢谢你回答问题,我很感谢你在Stackoverflow!请注意,这正是我建议的解决方案<代码>到目前为止
是累加器。@dyoo好的调用:)。我刚试过,但上面说我得等两天。另外,谢谢你回答问题,我很感谢你在Stackoverflow!请注意,这正是我建议的解决方案<代码>到目前为止
是累加器。您使用的是对递归有此限制的方案吗?MIT方案。它也可能与我的计算机/系统有关,这是相对过时的。你使用的是什么对递归有这种限制的方案?MIT方案。它也可能与我的计算机/系统有关,这是相对过时的。如果你不想使用累加器,该怎么做?你必须以某种形式使用累加器——即使在常规递归版本中使用的堆栈也充当累加器。另一个可以放置累加器的地方是变量中,您可以使用
set进行变异。如果您不想使用累加器,该怎么做?您必须以某种形式使用累加器——即使在常规递归版本中使用的堆栈也充当累加器。另一个可以放置累加器的地方是变量中,您可以使用
set进行变异