Scheme:列表中出现的次数

时间:2013-03-28 00:29:00

标签: 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
(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)))))))))

1 个答案:

答案 0 :(得分:1)

我打赌这是一个功课。如果不是,这是解决它的惯用方法:

(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的{​​{1}}函数,并且给定的字母,计算它在列表中出现的次数。有了这个程序,编写count程序非常容易(事实上,你可以在上面讨论我的实现!)。别忘了测试它:

p