1

文字のリストである 1 つのパラメーター X を持つ "p" というスキーム関数を作成しようとしています。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 に答える