Functional programming scheme列表中有多少元素
我需要用scheme语言编写一个函数来计算列表中有多少元素 比如说Functional programming scheme列表中有多少元素,functional-programming,scheme,Functional Programming,Scheme,我需要用scheme语言编写一个函数来计算列表中有多少元素 比如说 (howMany'a)返回0 (howmount'(ab))返回1 (多少’(a(b)c))返回2 我该怎么做?我不想要一个工作代码,只是一个这样做的想法。所以也许你应该考虑删除工作代码。谢谢这句话很可能会被否决,但是,我不知道这个计划。然而,我熟悉函数式编程 如果没有内置的选项,可以从“折叠”列表开始,起始值为0,每增加一次折叠就添加1。这很可能会让人对这个短语投反对票,但是,我不知道这个方案。然而,我熟悉函数式编程 如果没有
(howMany'a)
返回0(howmount'(ab))
返回1(多少’(a(b)c))
返回2
我该怎么做?我不想要一个工作代码,只是一个这样做的想法。所以也许你应该考虑删除工作代码。谢谢这句话很可能会被否决,但是,我不知道这个计划。然而,我熟悉函数式编程
如果没有内置的选项,可以从“折叠”列表开始,起始值为0,每增加一次折叠就添加1。这很可能会让人对这个短语投反对票,但是,我不知道这个方案。然而,我熟悉函数式编程
如果没有内置的选项,则从“折叠”列表开始,起始值为0,并在每增加一次折叠时添加1。折叠答案将起作用。然而,如果这是一个家庭作业,那么您可能会尝试只使用简单的内置函数来完成。有两种可能的答案 以下是天真的方式:
(define (howMany list)
(if (null? list)
0
(+ 1 (howMany (cdr list)))
)
)
(您的方案实现可能有一个函数empty?
,而不是null?
)
但是,此算法将占用与列表中元素数量成线性比例的空间量,因为在进行任何添加之前,它将为列表中的每个元素存储(+1…
)。凭直觉,你不应该需要这个。这里有一个更好的算法可以避免这个问题:
(define (howMany list)
(define (iter numSoFar restOfList)
(if (null? restOfList)
numSoFar
(iter (+ numSoFar 1) (cdr restOfList))
)
)
(iter 0 list)
)
(优点:使用Scheme的
(让iter…
语法来更简洁地编写。我使用这种风格是因为如果你只知道几个Scheme原语,它会更清晰。)折叠答案会起作用。然而,如果这是一个家庭作业,那么您可能会尝试只使用简单的内置函数来完成。有两种可能的答案
以下是天真的方式:
(define (howMany list)
(if (null? list)
0
(+ 1 (howMany (cdr list)))
)
)
(您的方案实现可能有一个函数empty?
,而不是null?
)
但是,此算法将占用与列表中元素数量成线性比例的空间量,因为在进行任何添加之前,它将为列表中的每个元素存储(+1…
)。凭直觉,你不应该需要这个。这里有一个更好的算法可以避免这个问题:
(define (howMany list)
(define (iter numSoFar restOfList)
(if (null? restOfList)
numSoFar
(iter (+ numSoFar 1) (cdr restOfList))
)
)
(iter 0 list)
)
(优点:使用Scheme的
(让iter…
语法来更简洁地编写。我使用这种风格是因为如果您只知道几个Scheme原语,它会更清晰。)它只是计算列表中的元素数
(define howMany
(lambda (list)
(cond
[(not (list? list)) 0]
[(null? list) 0]
[else (+ 1 (howMany (cdr list)))])))
它只是计算列表中元素的数量
(define howMany
(lambda (list)
(cond
[(not (list? list)) 0]
[(null? list) 0]
[else (+ 1 (howMany (cdr list)))])))
在scheme中有
foldr
和foldl
函数,+1方向应该无关紧要。@Nathan Sanders:在R6RS中,特别是在scheme中有foldr
和foldl
函数,+1方向应该无关紧要。@Nathan Sanders:在R6RS中,特别是(a((b)c)d)有效的,如果是的话,当调用它时,应该有多少返回3?是的,它是有效的,并且返回3。我以前的测试用例太模糊;你想要输入的长度,还是最深的嵌套级别?我不明白你的意思,但它很可能是最深的嵌套级别。a((b)c)d)有效吗,如果有效,调用它时应该有多少返回3?是的,它有效并返回3。我以前的测试用例太模糊;你们想要输入的长度,还是最深的嵌套级别?我不明白你们的意思,但很可能是最深的嵌套级别。通常,在作业中给出工作代码不是教人的好方法。老师想让学生解决这个问题,而不是随便找个人来解决。不过我知道你想帮忙。@LiraNuna:说得好。谢谢-下次我会努力做得更好。第二个测试也不及格通常,在家庭作业中分发工作代码不是教人的好方法。老师想让学生解决这个问题,而不是随便找个人来解决。不过我知道你想帮忙。@LiraNuna:说得好。谢谢-下次我会努力做得更好。第二个测试用例也失败了。您可以通过测试(非(配对列表))
来组合前两个cond
行。您可以通过测试(非(配对列表))
来组合前两个cond
行。