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

Using argmax to find largest number in a list of elements

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

我有谓词 note?pause? ,本质上它检查列表是否以 'note'pause 开头,然后 return 是真还是假. 但是我可以有包含音符和停顿的列表,称为 sequential-music-element(见上文 myseqlist)或 parallel-music-element(见上文 myparlist

如何定义一个 return 复音度的函数,将 4 个元素之一作为参数? (见下文我的尝试)

pause 复音度 = 0

note 复音度 = 1

sequence-music-element? returnchild的度数最大

parallel-music-element? returnchild仁

度数之和

如何完成这个功能:

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

我不确定在这种情况下如何使用 argmax。它应该检查 degree-of-polyphony 作为参数的整个元素列表的最高复音。

示例:(degree-of-polyphony myseqlist) 应该 return 1 因为它至少有一个音符,如果它全部停顿,它应该 return 0。

如果你只需要检查列表中是否有至少一个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 会很有用。