如何在进行深度递归时跟踪列表中的当前位置

时间:2014-12-03 01:16:25

标签: recursion scheme r5rs

我正在尝试做的是采用符号表达式,并将所有“叶子”替换为从左到右的列表中的数字,因此最左边的叶子应该替换为1,接下来的2等等。

这是我目前的代码(我正在使用R5RS,我试图不使用变异)

(define subst
  (lambda (sexp num)
    (cond ((null? sexp) '())
          ((not (pair? sexp)) (car num))
          (else (cons (subst (car sexp) num)
                      (subst (cdr sexp) (cdr num)))))))

(define numbers (list 1 2 3 4 5 6 7 8 9 10))

输出:

(subst '(((a (d . e)) (b . c)) . (c . d)) numbers)

是:

'(((1 (2 . 3)) (2 . 3)) 2 . 3)

我想输出的是:

'(((1 (2 . 3)) (4 . 5)) 6 . 7)

当我遇到并替换一个叶子时,我想我需要在之前的subst递归中将num更改为cdr num,但我不知道如果不使用set我怎么做呢!

任何帮助都将不胜感激,谢谢。

0 个答案:

没有答案