Как мне вычислить argmax функции в списке в Stanza?
Я хотел бы знать, есть ли функция для вычисления argmax функции
f
в списке чисел (целые, длинные, числа с плавающей запятой)
numbers
в Станце.
Он будет иметь следующее поведение:
defn argmax (f, numbers: Tuple) :
val N = length(numbers)
if N == 0 :
fatal("Can't compute the argmax of an empty tuple")
var max-index = 0
var max-value = numbers[0]
for idx in 1 to N do :
val value = f(numbers[idx])
if value > max-value :
max-index = idx
max-value = value
max-index
defn f (x) :
x * x
println $ argmax(f, [1, 6, 2, 5])
Результат :
1
Спасибо!
2 ответа
Один способ создать
argmax
выполнен в функциональном стиле:
defn argmax (nums:Tuple<Comparable>) :
reduce(fn (a, b) : a when (a[1] > b[1]) else b, zip(0 to false, nums))[0]
который применяет попарно
max
над набором объединенных индексов и значений. Чтобы завершить решение, вы должны использовать следующее:
defn f (x) :
x * x
defn argmax (f, nums:Tuple<Comparable>) :
argmax(map(f, nums))
Вы можете использовать пару функций
argmax!
и
argmax?
, что является распространенной идиомой в строфе, где операция последовательности может завершиться неудачно (в данном случае, когда кортеж пуст)
Например:
defpackage argmax:
import core
import collections
defn argmax? (vals:Seqable<Comparable>) -> False|Int:
false when empty?(to-seq(vals)) else argmax!(vals)
defn argmax! (vals:Seqable<Comparable>) -> Int:
defn compare (left:[Comparable, Int], right:[Comparable, Int]):
left when left[0] > right[0] else right
val [_, argmax] = reduce(compare, zip(vals, 0 to false))
argmax
val vals = [1, 6, 2, 5]
println("argmax of [%,] is: %_" % [vals, argmax!(vals)])
println("argmax of empty tuple is: %_" % [argmax?([])])
Чтобы применить функцию к произвольной последовательности, вы можете использовать
seq
val vals = [1, 6, 2, 5]
defn f (x):
x * x
println("argmax of f = %_" % [argmax?(seq(f, vals))])
Аннотации типов необязательны, они здесь для ясности.