2017-10-15 54 views
-1

好的元素列表數量最多,所以我定義3名列表:使用argmax找到

(define mylist '((pause 5 5 5)(note 3 4 5)(pause 3 4 4))) 
(define myseqlist '(sequential-music-element (note 5 5 5) (note 4 3 4) (note 5 3 4))) 
(define myparlist '(parallel-music-element (note 5 2 5) (note 4 2 4) (note 5 3 1))) 

我有謂詞note?pause?,本質上它檢查是否名單開始的'note'pause然後返回true或錯誤。 但是我可以有含註釋和暫停清單,這是callled順序音樂元素(見上文myseqlist)或平行音樂元素(見上文myparlist

如何可以定義返回的程度的函數複音,它將4個元素中的一個作爲參數? (參見下面的我的嘗試)

pause度複音= 0

note度複音= 1

序列音樂元件的? 返回度數最大的孩子

平行音樂元素? 返回度兒童

如何完成這個功能的總和:

(define (degree-of-polyphony elem) 
    (cond [(note? elem) 1] 
     [(pause? elem) 0] 
     [(sequential-music-element? elem) (argmax ???)])) 

我不知道如何利用argmax在這種情況下。它應該檢查degree-of-polyphony作爲參數的整個元素列表的最高複音。

實例:(學位的複音myseqlist)應該返回1,因爲它具有至少一個註釋,如果所有的暫停,應該返回0

+2

請不要破壞你的帖子。一旦你發佈了一個問題,它就一般屬於Stack Overflow社區(在CC-by-SA許可下)。如果您想取消關聯該帳戶與您的帳戶的關聯,請參閱[解除關聯請求的正確途徑](http://meta.stackoverflow.com/q/323395/584192)? –

回答

1

如果你只是要檢查是否至少有一個note在列表中,我會與此去:

(define (note? ele) 
    (and (pair? ele) 
     (eq? (car ele) 'note))) 

(define (degree-of-polyphony elem) 
    (cond [(note? elem) 1] 
     [(pause? elem) 0] 
     [(sequential-music-element? elem) 
     (if (ormap note? elem) 1 0)])) 

ormap檢查是否存在滿足給定的條件,如果我們需要找到一個最大值argmax將是有益的至少一個元件。

+0

它工作,如果我給它myseqlist,但如果它只給它一個暫停列表,它不會返回0,它不會做任何 – crystyxn

+0

請給我看清單。也許你通過了一個「並行音樂元素」?注意你沒有處理這種情況。 –

+0

我通過了''((暫停5 5 5)(暫停3 4 5)(暫停3 4 4))' – crystyxn