【问题标题】:Using argmax to find largest number in a list of elements使用 argmax 查找元素列表中的最大数
【发布时间】:2017-10-15 20:30:11
【问题描述】:

好的,所以我定义了 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 开头,然后返回真或假。 但是我可以有一个包含音符和暂停的列表,这被称为顺序音乐元素(参见上面的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。

【问题讨论】:

标签: scheme lisp racket argmax


【解决方案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 将很有用。

【讨论】:

  • 如果我给它 myseqlist 它可以工作,但是如果它给它一个只有暂停的列表,它不会返回 0,它不会做任何事情
  • 请给我看清单。也许你通过了parallel-music-element?请注意,您没有处理该案例。
  • 我通过了'((pause 5 5 5)(pause 3 4 5)(pause 3 4 4))
  • 没错,你没有标记列表——它不是一个注释、一个暂停或一个顺序或并行列表,所以它不属于你的程序的任何条件,因此它返回无效。你应该像这样传递它:'(sequential-music-element (pause 5 5 5) (pause 3 4 5) (pause 3 4 4))
  • 但在这种情况下,我不传递元素序列。我传递了一组元素。所以复音度数应该返回找到的最大复音数(意思是如果有一个音符,它会返回1)
猜你喜欢
  • 1970-01-01
  • 2021-08-29
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多