Преобразование рекурсивной функции в хвостовую рекурсивную функцию в схеме - PullRequest
1 голос
/ 12 марта 2012

У меня есть функция:

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

3 голосов
/ 13 марта 2012

Мой друг решил это, вставил для любых будущих запросов:

(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 голос
/ 12 марта 2012

Да, преобразование его в хвостовую рекурсию решит проблему.Лучший способ сделать это в этом случае - использовать аккумулятор .Это значение, которое вы передаете, представляя вычисление, которое вы уже сделали, или то, что вам осталось сделать.Например, вы можете передать созданные вами битовые строки, а затем выполнить append, когда доберетесь до конца.

...