1

私は以下に書かれている難しい言葉の問題に取り組んでいます。これにアプローチする方法を理解するのに助けが必要です:

特定の停留所で特定のバスに乗った人の数をカウントする Scheme 関数があるとします。バスには多くの停留所があり、それぞれに 1 から 100 までの番号が割り当てられています。(i) 各バス停から乗車した人の数を与える関数 f と (ii)整数 m で、バスが乗車した停留所の数を m 個以下で返します。例: バス停ピックアップ関数が次のようであるとします。

(define (stops n)
    (cond ((= n 10) 20)
          ((= n 18) 18)
          ((= n 39) 52)
          ((= n 52) 12)
          ((= n 58) 23)
          ((= n 70) 34)
          ((= n 73) 18)
          ((= n 82) 11)
          ((= n 97) 33)
          (else 0)))

この手順を上記の停留所手続きに適用し、m=20 を指定すると、20 人以下の乗客が乗車した停留所は停留所 10、18、52、73、および 82 だけであるため、5 が返されます。

これに対する私の最初のアプローチは、パラメーター n を追加するヘル​​パー関数を作成することですが、それが何をするのか完全にはわかりません (おそらくカウントを追加しますか?)。それ以外は、私は完全に立ち往生しています。明確にすることができれば。ガイダンス、またはこの問題への方向性を教えていただければ幸いです。

4

4 に答える 4

2

私は名前付き let のファンです。

(define (how-many f m)
  (let loop ((i 1) (res 0))
    (if (<= i 100)
        (loop (+ i 1) (if (<= 1 (f i) m) (+ res 1) res))
        res)))
于 2013-10-10T17:42:06.733 に答える
0

解決策はあるが、唯一の解決策とはほど遠い

?b は、#t または #f の代わりに 0 または 1 を返す述語の私の表記法です。

(define *potential-stops* (iota 100 1 1))

(define (stops-lt-m f m)
  (let ((lt-m?b (lambda (x) (if (> (f x) m) 0 1))))
    (reduce + 0 (map lt-m?b potential-stops)))) 

lt-m で (length (filter ...)) 実装を使用することもできますか?

これは定数ですが、停車地の番号付けシステムが変更された場合は変更が必要になる可能性があるためです。

于 2013-10-10T15:56:31.307 に答える