-1

好的,所以我定义了 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?and pause?,本质上它检查列表是否以开头'note'pause然后返回真或假。但是我可以有包含音符和暂停的列表,这被称为顺序音乐元素(见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作为参数的整个元素列表的最高复音。

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

4

1 回答 1

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如果我们需要找到最大值,这将很有用。

于 2017-10-15T21:00:49.277 回答