好的,我定义了3个列表:
(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)))
我有谓词{{1}}和note?
,基本上它检查列表是以pause?
开头还是'note
然后返回true或false。
但是我可以有包含音符和暂停的列表,这些音符被称为连续音乐元素(参见上面的'pause
)或并行音乐元素(参见上面的myseqlist
)
如何定义一个返回复音程度的函数,该函数将4个元素中的一个作为参数? (见下文我的尝试)
myparlist
复音度= 0
pause
复音度= 1
序列音乐元素? 返回最大程度的孩子的学位
平行音乐元素? 返回孩子的学位总和
如何完成此功能:
note
在这种情况下,我不确定如何使用argmax。它应该检查(define (degree-of-polyphony elem)
(cond [(note? elem) 1]
[(pause? elem) 0]
[(sequential-music-element? elem) (argmax ??? )]))
作为参数的整个元素列表的最高复音。
示例:(复音度myseqlist)应该返回1,因为它至少有一个音符,如果它全部暂停,它应该返回0.
答案 0 :(得分: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
会很有用。