2013-03-27 38 views
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 

內,因爲有3個「+在BAE

+0

你知道如何爲遞歸結構設計函數嗎?您是否閱讀過以下內容:http://www.ccs.neu.edu/home/matthias/HtDP2e/part_two.html#(part._ch~3adesign-lists)呢? – dyoo 2013-03-27 20:32:13

+0

你是否遵循你的老師用來教你如何設計程序的設計食譜?如果沒有,你應該。您迄今爲止顯示的代碼幾乎可以跳過配方中的每一步。表明。 – dyoo 2013-03-27 20:36:06

回答

1

您需要:

  1. 發佈樹的定義 - 我猜bae是一個結構 - 不要假設我們知道你的代碼,發佈所有的re東昇信息作爲問題的一部分
  2. 確保你的代碼部分後至少工作 - 例如,(define bae ...)部分不會,即使你提供的bae定義的工作,因爲命名衝突的
  3. 按照食譜遍歷二叉樹,我敢打賭,這是正確的課本

該解決方案的總體思路是這樣的,沒有考慮看看實際執行的代碼你這樣做的遠是我能給你的唯一幫助:

  1. 如果樹爲空,則返回0
  2. 如果當前元素的值等於搜索值,則加1;否則加0
  3. 無論哪種方式,價值增加的遞歸遍歷左,右子樹結果
+0

而我們甚至不能說提示1在不知道數據定義是什麼的情況下是有幫助的。在這裏談論一棵「空」樹還有意義嗎?對於最初的提問者:你需要解釋你的數據結構是什麼:否則,編寫處理這些數據的程序不太可能。 – dyoo 2013-03-27 20:41:03

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)))