使用argmax查找元素列表中的最大数字

时间:2017-10-15 20:30:11

标签: scheme lisp racket argmax

好的,我定义了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.

1 个答案:

答案 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会很有用。