方案:计算函数中lambda符号的数量

方案:计算函数中lambda符号的数量,lambda,count,scheme,Lambda,Count,Scheme,所以我们对这个方案进行了测试,我把其中一个问题弄错了,但我不知道如何纠正它。它要求的是: 编写一个Scheme函数count_lambda,该函数接受任意表达式y,并返回y中的“lambda”符号数。例如,调用(count_lambda'(lambda x.lambda y.x y)z)应该返回2 我想到的方法是检查变量是否为“lambda”类型。然而,lambda可能不是一种。。。。。。。还有,我把这个表达式想象成一个列表。。。。我也不确定我是否能做到……所以我有: (define coun

所以我们对这个方案进行了测试,我把其中一个问题弄错了,但我不知道如何纠正它。它要求的是:

编写一个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是一个未定义的函数,所以这里告诉我我看错了。不幸的是,我不知道该怎么办

任何帮助都将不胜感激


谢谢,这比你想象的要简单。请注意,输入是一个符号列表,您需要计算符号
的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)))))))
,但我只想指出,使用
lambda?
不是一个坏主意,但您需要做到这一点。此外,
cons?
不是
scheme
中的原语,但可能是近亲语言
#!球拍
有自己的SO标签

以下是使用最新批准的标准R7RS实施的
方案

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

您提供的示例输入不正确,它有括号问题,这是:
x.lambda
看起来像一个错误,也许您的意思是
x.lambda
?请检查并修复它。它看起来没有空格,但可能有。有什么区别?它让世界变得不同。
x.lambda
不是
lambdade>symbol,而
x.lambda
包含一个
lambda
符号。非常重要的是,您提供了正确的输入,即使有适当的空格,您给出的示例也无法编译,它是一个无效的表达式,因为点和括号放错了,我不知道。我看到括号错了;我只是想不出来她给我们的输入是正确的。对我来说,在x和y之间应该有一个?等一下,我不应该加括号。你确定输入是符号列表吗?OP写道“编写一个Scheme函数count_lambda,它接受任意表达式y,并返回y中的‘lambda符号数’。”在我看来,
(lambda 234 lambda(x lambda))
将是一个表达式,但它不仅仅是一个符号列表。@JoshuaTaylor引用了示例输入,除非OP声明相反,否则我将假设它是一个符号列表。我不认为OP意味着使用任意表达式,这看起来像是编程入门课程的第一步,没有意义(从教学角度来看)为了在编写过程中处理任意表达式,我认为这篇文章是逐字引用文本。在许多地方,这几乎是学期末;我不认为计算树中出现的
lambda
(与列表相反)应该太难了。也就是说,希望OP会澄清。问题似乎更可能是关于列表的。只是澄清一下,这个课程不是基于Scheme的。我们看了几节,这是关于测试的一节。我们没有太深入。@ÓscarLópez没有必要使用
null?
子句。当
y
90
时,
(而不是(对y))
将为真,并且
lambda
不会为'eq',因此仍然会得到
0
。只需要两种情况:对和非对。