Functional programming scheme列表中有多少元素

Functional programming scheme列表中有多少元素,functional-programming,scheme,Functional Programming,Scheme,我需要用scheme语言编写一个函数来计算列表中有多少元素 比如说 (howMany'a)返回0 (howmount'(ab))返回1 (多少’(a(b)c))返回2 我该怎么做?我不想要一个工作代码,只是一个这样做的想法。所以也许你应该考虑删除工作代码。谢谢这句话很可能会被否决,但是,我不知道这个计划。然而,我熟悉函数式编程 如果没有内置的选项,可以从“折叠”列表开始,起始值为0,每增加一次折叠就添加1。这很可能会让人对这个短语投反对票,但是,我不知道这个方案。然而,我熟悉函数式编程 如果没有

我需要用scheme语言编写一个函数来计算列表中有多少元素

比如说

(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
行。