1

我正在尝试编写一个名为“p”的方案函数,其中一个参数 X 是字母列表。如果 a 的数量比 b 的数量少 1,则该函数应返回 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)))))))))
4

1 回答 1

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用于此问题的方式不正确,如果您更改 s 中定义的变量的值,它可能会let起作用,但我真的怀疑这是在这种情况下编写解决方案的最佳方法
  • 您错误地假设传递给count过程的参数会在返回后以某种方式存储结果count- 这是不对的,它不会那样工作

从上面的代码中获取想法来编写自己的解决方案 - 首先,您需要定义一个使用的count-letters函数,并且对于给定的字母,计算它在列表中出现的次数。有了这个过程,编写过程就很容易了(事实上,你可以直接扼杀我上面的实现!)。不要忘记测试它:countp

(p '("a" "b" "b"))
=> #t
(p '("a" "a" "b" "b"))
=> #f
于 2013-03-28T00:57:21.450 回答