编写区分尾部与非尾部调用方案的函数

时间:2016-10-26 18:05:37

标签: scheme tail-recursion

我正在尝试定义一个函数,它在一个sexpr in scheme中标记尾部和非尾部调用。 它的定义如下:

TCS ::= SYMBOL | NUMBER | IF | FUNCTION-CALL

IF ::= (if TCS TCS TCS)

FUNCTION-CALL ::= (TCS TCS...)

输入/输出的示例是:

(mark-tail-calls '(if (a (b c)) (e (f g) h) i) (j (k 7)))
=> (if (non-tail-call a (non-tail-call b c)) (non-tail-call e (non-tail-call f g) h) i) (tail-call j (non-tail-call k 7))

我理解尾部和非尾部调用之间的区别,但是考虑到我对方案的经验很少,我很难编写函数。任何帮助/指向正确方向的人都将不胜感激

1 个答案:

答案 0 :(得分:0)

希望能帮助你入门:

您通常会对输入结构进行案例分析(并递归)。

的内容
(define (mark-tail-calls e)
    (cond ((null? e) '())
          ((symbol? e) e)
          ((number? e) e)
          ((if? e) (list 'íf ...)
          ((symbol? (car e)) ...)
          (#t ...))))

if?定义为

(define (if? e)
  (and (pair? e)
        (equal? (car e) 'if)))