方案:计算函数中lambda符号的数量
所以我们对这个方案进行了测试,我把其中一个问题弄错了,但我不知道如何纠正它。它要求的是: 编写一个Scheme函数count_lambda,该函数接受任意表达式y,并返回y中的“lambda”符号数。例如,调用(count_lambda'(lambda x.lambda y.x y)z)应该返回2 我想到的方法是检查变量是否为“lambda”类型。然而,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
(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
。只需要两种情况:对和非对。