【问题标题】:Writing function which distinguishes tail vs non-tail calls Scheme编写区分尾部与非尾部调用方案的函数
【发布时间】:2016-10-26 18:05:37
【问题描述】:

我正在尝试定义一个函数,该函数在方案中的 sexpr 中标记尾部调用与非尾部调用。 其定义如下:

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

我了解尾调用和非尾调用之间的区别,但考虑到我对方案没有什么经验,我很难编写函数。任何帮助/指向正确方向将不胜感激

【问题讨论】:

    标签: scheme tail-recursion


    【解决方案1】:

    希望能助您一臂之力:

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

    类似的东西

    (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)))
    

    【讨论】:

      猜你喜欢
      • 2012-07-29
      • 2017-04-18
      • 1970-01-01
      • 2021-08-13
      • 2018-02-18
      • 2021-04-23
      • 2015-05-09
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多