2012-11-05 58 views
1

如果您有一個清單((1 4 5)5(6 2 5))和另一個清單(5 1 3 7 5(9 2 4)),我需要編寫一個過程來比較第一個清單中的項目並看看他們是否在第二。例如,(1 4 5)在(5 1 3 7 5(9 2 3))中出現0次。 5在該列表中出現2次,並且(9 2 4)出現0次。所以列表將返回(0 2 0)比較列表中的項目?

我需要幫助編寫一個計劃程序頻率,它需要兩個列表,第一個是每個組件比較的程序頻率,第二個是計算第一個列表的出現。該過程應該返回出現的列表。

謝謝!

回答

0

通常我會在模板列表中

template<class t> 
class list 
{ 
    bool contains(t obj) 
    { 
    for(int i = 0; i < this->size; i++) 
     if(this->at(i) == obj) 
     return true; 
    } 
} 

我希望這將有助於你的方法解決這個問題;)

+2

您是否使用C++來回答一個計劃問題,對他不做功課有微妙的挖掘? – itsbruce

2

這顯然是一門功課,所以我不會給你一個直回答。相反,我會指出你正確的方向。對於初學者來說,在兩個程序分裂問題:

  • 第一個過程,我們稱之爲counter,接收一個元素和元素的列表。它遍歷元素列表,詢問每個元素是否等於作爲參數傳遞的元素。如果找到匹配,它將累加一個結果,如果不匹配,則繼續下一個元素。列表遍歷在到達空列表時結束,爲此計數器返回零。

  • 第二個過程,名爲frequency接收問題中的兩個列表並遍歷第一個列表(要比較的元素列表)。對於這些元素中的每一個,它都會調用counter來找出結果,並沿途建立一個列表。

下面是該解決方案的總體結構,必須填寫在空白:

(define (counter ele lst) 
    (cond ((null? lst) 
     <???>) 
     ((equal? ele <???>) 
     (<???> (counter ele <???>))) 
     (else 
     (counter ele <???>)))) 

(define (frequency els lst) 
    (if (null? els) 
     <???> 
     (cons <???> 
      (frequency <???> lst)))) 

請注意,在counter我假設元素被搜索在基本水平列表,比如這將找不到元素:

(counter 5 '((5))) 
=> 0 

如果你必須要找到像上面例子中的一個比賽,那麼問題是一個比較有趣的 - 你需要以樹狀方式遞歸遍歷列表。 Stack Overflow或Internet中的其他地方有無數的例子;如果你感覺有點迷茫,我建議你看看The Little SchemerHow to Design Programs,這兩本書都會教你如何在整體上討論遞歸過程。