【问题标题】:Scheme: Count number of lambda symbols in function方案:计算函数中 lambda 符号的数量
【发布时间】:2013-11-18 19:09:41
【问题描述】:

所以我们对 Scheme 进行了测试,我发现其中一个问题是错误的,但我不知道如何纠正它。它要求的是:

编写一个 Scheme 函数 count_lambda,它接受任意表达式 y,并返回 y 中 'lambda 符号的数量。例如,调用 (count_lambda '(lambda x . lambda y . x y) z) 应该返回 2。

我想到的方法是检查变量是否为“lambda”类型。但是,lambda 可能不是一种类型.......另外,我把表达式想象成一个列表......不确定我是否也可以这样做......所以这就是我所拥有的:

 (define count_lambda
  (lambda (y)
    (if (null? y) 0
    (cond
      ((lambda? y) 1)
      ((number? y) 0)
      ((cons? y) (+ (count_lambda(car y)) (count_lambda(cdr y)))))))

它说 lambda 是一个未定义的函数,所以那里告诉我我看错了。不幸的是,我不知道该怎么做。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 您提供的示例输入不正确,它有括号问题,并且:x.lambda 看起来像一个错误,也许您的意思是x . lambda?请检查并修复它。
  • 看起来好像没有空间了,但也许吧。有什么区别?
  • 它让世界变得与众不同。 x.lambda 不是 lambda 符号,而 x . lambda 包含 lambda 符号。提供正确的输入非常重要,即使有适当的空格,您提供的示例也不会编译,这是一个无效的表达式,因为点和括号放错了
  • 好吧,不知道。我看到括号错了;我只是认为她让我们进入的内容是正确的。对我来说,看起来 x 和 y 之间应该有一个?
  • 等一下,我不应该加括号

标签: lambda count scheme


【解决方案1】:

这比你想象的要简单。请注意,输入是符号列表,您需要计算符号'lambda 在列表中出现的次数,而不是实际出现的lambda 的次数。

此外,用于迭代列表列表的模板也不完全正确。它应该是这样的:

(define count_lambda
  (lambda (y)
    (cond ((null? y) 0) ; is the list empty?
          ((not (pair? y)) ; if the current element is an atom
           (if (eq? y 'lambda) 1 0)) ; then check to see if is a lambda
          (else (+ (count_lambda (car y)) ; otherwise advance recursion
                   (count_lambda (cdr y)))))))

【讨论】:

  • 您确定输入是符号列表吗? OP 写了“编写一个 Scheme 函数 count_lambda,它采用任意表达式 y,并返回 y 中 'lambda 符号的数量。”在我看来,(lambda 234 lambda (x lambda)) 将是一个表达式,但它不仅仅是一个符号列表。
  • @JoshuaTaylor 引用了示例输入,除非 OP 声明相反,否则我将假设它是符号列表。我不认为 OP 打算使用任意表达式,这看起来像是入门编程课程的第一步,在课程的这一点上处理任意表达式(从教学 POV)是没有意义的
  • 它的写作方式,我虽然那个OP是从文本中逐字引用。很多地方都快到学期末了;我认为在 tree(与 list 相对)中计算 lambda 的出现应该不会太困难。也就是说,希望OP能够澄清。 确实问题似乎更可能与列表有关。
  • 澄清一下,这个类不是基于Scheme。这是我们检查的几个部分,这是一个关于测试的部分。我们没有深入了解它。
  • @ÓscarLópez 这里不需要null? 子句。当y90 时,(not (pair?y y)) 将是真的,它不会是`eq?` 到lambda,所以你仍然会得到0。只需要两种情况:pair 和 non-pair。
【解决方案2】:

Óscar has a good answer,但我只想指出,使用lambda? 不是一个坏主意,但你需要做到。此外,cons? 不是scheme 中的原语,但可能是表亲语言#!racket,它有自己的 SO-tag。

这是使用最新批准的标准 R7RS 的Scheme 实现:

#!r7rs
(import (scheme base)
        (only (scheme) display))

(define (lambda? x)
    (eq? x 'lambda))

(define (count-lambda lst)
  (cond
    ((lambda? lst) 1)
    ((not (pair? lst)) 0) ; cons? is not a scheme primitive
    (else (+ (count-lambda (car lst)) 
             (count-lambda (cdr lst))))))


(display (count-lambda '(yatta (lambda . lambda) #f #t 34 
                        (hey (ho lambda . yiu) lambda )))) ; displays 4

与您的代码相比,我删除了对数字的检查(因为不是对或 lambda 可以是不同的符号、数字、#t),而是添加了一个实际执行相同操作的基本情况.

它将在 R6RS 中工作(因为 R7RS 仅由 chibi 支持,我们有很多好的 R6RS 实现,例如 DrRacket 和 Ikarus,将前 3 行替换为:

#!r6rs
(import (rnrs base)
        (only (rnrs) display))

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 2019-06-20
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多