Scheme 方案:列表中出现的次数

Scheme 方案:列表中出现的次数,scheme,racket,Scheme,Racket,我正在尝试编写一个名为“p”的Scheme函数,其中有一个参数X,它是一个字母列表。如果a的数量比b的数量少一个,则函数应返回true。这就是我所拥有的,但无法回避的论点错误。非常感谢您的帮助 #lang scheme (define p (lambda (X) (let ((countA 0)) (let ((countB 0)) (count(countA countB X) (if (= countA (- countB 1)) #t #f)))))) (define count (l

我正在尝试编写一个名为“p”的Scheme函数,其中有一个参数X,它是一个字母列表。如果a的数量比b的数量少一个,则函数应返回true。这就是我所拥有的,但无法回避的论点错误。非常感谢您的帮助

#lang scheme

(define p
(lambda (X)
(let ((countA 0))
(let ((countB 0))
(count(countA countB X)
(if (= countA (- countB 1))
#t
#f))))))

(define count
(lambda (A B X)
(if (null? (cdr X))
(car X)
((if (string=? "a" (car X))
((+ A 1) (p(cdr X)))
((if (string=? "b" (car X))
((+ B 1) (p(cdr X)))
(p(cdr X)))))))))

我打赌这是一个家庭作业。如果不是,这是解决问题的惯用方法:

(define (p lst)
  (= (count-letters "a" lst)
     (- (count-letters "b" lst) 1)))

(define (count-letters letter lst)
  (count (lambda (e) (string=? e letter))
         lst))
。。。但当然,你需要用手来解决这个问题。关于您的代码的一些反馈:

  • 有多个放错位置的括号
  • 特别是,在
    if
  • 对于这个问题,您使用
    let
    的方法是不正确的,如果您对
    let
    中定义的变量值进行变异,它可能会起作用,但我真的怀疑在这种情况下,这是编写解决方案的最佳方法
  • 您错误地假设传递给
    count
    过程的参数会在
    count
    返回后以某种方式存储结果-这是不对的,它不会这样工作
从上面的代码中汲取灵感,编写您自己的解决方案-首先,您需要定义一个
count letters
函数,该函数不使用
count
,并且对于给定的字母,它会计算它在列表中出现的次数。有了这个过程,编写
p
过程就非常容易了(事实上,您只需在上面snarf我的实现就可以了!)。别忘了测试它:

(p '("a" "b" "b"))
=> #t
(p '("a" "a" "b" "b"))
=> #f

我打赌这是一个家庭作业。如果不是,这是解决问题的惯用方法:

(define (p lst)
  (= (count-letters "a" lst)
     (- (count-letters "b" lst) 1)))

(define (count-letters letter lst)
  (count (lambda (e) (string=? e letter))
         lst))
。。。但当然,你需要用手来解决这个问题。关于您的代码的一些反馈:

  • 有多个放错位置的括号
  • 特别是,在
    if
  • 对于这个问题,您使用
    let
    的方法是不正确的,如果您对
    let
    中定义的变量值进行变异,它可能会起作用,但我真的怀疑在这种情况下,这是编写解决方案的最佳方法
  • 您错误地假设传递给
    count
    过程的参数会在
    count
    返回后以某种方式存储结果-这是不对的,它不会这样工作
从上面的代码中汲取灵感,编写您自己的解决方案-首先,您需要定义一个
count letters
函数,该函数不使用
count
,并且对于给定的字母,它会计算它在列表中出现的次数。有了这个过程,编写
p
过程就非常容易了(事实上,您只需在上面snarf我的实现就可以了!)。别忘了测试它:

(p '("a" "b" "b"))
=> #t
(p '("a" "a" "b" "b"))
=> #f

此代码有太多错误。。。括号问题,过程调用问题。我建议您从头开始,依次测试每个过程,甚至在将其作为问题发布之前,我没有发现任何括号问题,只是参数错误罗比:相信我,代码中有几个括号问题。例如:在
if
周围加双括号是错误的。按照我的建议,从头开始,先编写一点功能,然后进行测试,在进入解决方案的下一部分之前反复测试以确保正确。另外,忘记这个问题的
let
表单,这不是解决问题的方法。您错误地假设传递给
count
过程的参数会在
count
返回后以某种方式存储结果-这是不对的,它不会工作此代码有这么多错误。。。括号问题,过程调用问题。我建议您从头开始,依次测试每个过程,甚至在将其作为问题发布之前,我没有发现任何括号问题,只是参数错误罗比:相信我,代码中有几个括号问题。例如:在
if
周围加双括号是错误的。按照我的建议,从头开始,先编写一点功能,然后进行测试,在进入解决方案的下一部分之前反复测试以确保正确。另外,忘记这个问题的
let
表单,这不是解决问题的方法。您错误地假设传递给
count
过程的参数在
count
返回后会以某种方式存储结果-这是不对的,它不会起作用啊,我看到了我以前的代码的错误(基本上是一个clusterfluff),我按照您的建议从头开始并使用了您的想法,现在它起作用了。非常感谢!!啊,我看到了我以前的代码的错误(基本上是一堆乱七八糟的代码),我像你建议的那样从头开始,使用了你的想法,现在它工作了。非常感谢!!