0

ここで何をする必要があるか誰か教えてもらえますか?

(define (count-values abst v)
  (cond [(empty? abst) 0]
        [else (+ (cond [(equal? v (bae-fn abst)) 1]
                       (else 0))
                 (count-values .... v)
                 (count-values .... v ))]))

基本的に、バイナリツリー内のシンボル v の量をカウントする関数が必要です

(define bae
  (make-bae '+
            (make-bae '* (make-bae '+ 4 1)
                      (make-bae '+ 5 2))
            (make-bae '- 6 3)))
(count-values bae '+) => 3

bae には 3 '+ があるため

4

2 に答える 2

1

必要がある:

  1. ツリーの定義を投稿します-私はbae構造体だと思います-私たちがあなたのコードを知っていると仮定しないでください、すべての関連情報を質問の一部として投稿してください
  2. 投稿するコードが少なくとも部分的に機能することを確認してください。たとえば、名前の競合により、(define bae ...)の定義を提供してもその部分は機能しませんbae
  3. 二分木をトラバースするためのレシピに従ってください。教科書に載っているはずです

ソリューションの一般的なアイデアは次のようになります。これまでに行ったコードの実際の実装を確認することは、私が提供できる唯一の助けです。

  1. ツリーが空の場合、0 を返します
  2. 現在の要素の値が検索された値と等しい場合は、1 を追加します。それ以外の場合は 0 を追加
  3. いずれにせよ、左右のサブツリーを再帰的にトラバースした結果に値を追加します
于 2013-03-27T17:24:44.887 に答える
0

データ構造を再帰的に定義すると、再帰カウント アルゴリズムが自然に発生します。

;; Utils
(define (list-ref-at n)
  (lambda (l) (list-ref l n)))
(define (eq-to x)
  (lambda (y) (eq? x y)))

;; Data Type    
(define (make-bae op arg1 arg2)
  `(BAE ,op, arg1, arg2))
(define (bae? thing) 
  (and (list? thing) (eq? 'BAE (car thing)) (= 4 (length thing))))
(define bae-op   (list-ref-at 1))
(define bae-arg1 (list-ref-at 2))
(define bae-arg2 (list-ref-at 3))

;; Walk
(define (bae-walk func bae)  ;; 'pre-ish order'
  (if (not (bae? bae))
      (func bae)
      (begin
        (func (bae-op bae))
        (bae-walk func (bae-arg1 bae))
        (bae-walk func (bae-arg2 bae)))))

;; Count
(define (bae-count-if pred bae)
  (let ((count 0))
    (bae-walk (lambda (x) 
                 (if (pred x) 
                     (set! count (+ 1 count))))
              bae)
     count))

(define (bae-count-if-plus bae)
  (bae-count-if (eq-to '+) bae))

> bae
(BAE + (BAE * (BAE + 4 1) (BAE + 5 2)) (BAE - 6 3))

> (bae-count-if-plus bae)
3

;; Find
(define (bae-find-if pred bae)
  (call/cc (lambda (exit)
             (bae-walk (lambda (x)
                         (if (pred x) (exit #t)))
                       bae)
             #f)))
于 2013-03-29T02:06:50.200 に答える