尝试概念化如何在不使用可变变量的情况下比较列表中的多个值以找到最大值。
例如,使用命令式语言,我可以简单地存储一个max变量,每次迭代在列表中找到更大的值时该变量都会更新。像这样:
max = 0;
for i in list
if i > max
max = i
现在,在函数式编程中,如果我有一个列表,例如[1; 2; 3] 如何解决使用max变量的问题?
答案 0 :(得分:2)
简单的答案是使用install.packages("nnet")
library(nnet)
ird <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),
species = factor(c(rep("s",50), rep("c", 50), rep("v", 50))))
samp <- c(sample(1:50,25), sample(51:100,25), sample(101:150,25))
ir.nn2 <- nnet(species ~ ., data = ird, subset = samp, size = 2, rang = 0.1,
decay = 5e-4, maxit = 200)
install.packages("pmml")
library(pmml)
pmmlmodel <- pmml(ir.nn2)
saveXML(pmmlmodel,file = "IrisNet.xml")
。
如果您想在不使用显式可变变量的情况下“自己动手”,显而易见的方法是使用递归函数。就个人而言,我会这样定义:
let maxValue = List.max theList
请注意,此实现将在输入列表为空的情况下引发异常(另外,我尚未进行实际测试,因此其中可能会出现轻微错误)。我这样做的原因是它使用了尾部递归,这应该意味着它与可变解决方案大致一样有效,但是却使暴露的函数签名的复杂性降至最低。
或者,也可以通过List.fold调用相当容易地完成此操作。例如。
let listMax theList =
let rec maxHelper remainingList maxSoFar =
match remainingList with
| [] -> maxSoFar
| h :: t ->
if h > maxSoFar then
maxHelper t h
else
maxHelper t maxSoFar
maxHelper theList (List.head theList)
关于未测试的条款也适用于此。
在上述两种情况下,通过使用另一个参数(执行该操作的函数),可以使其更通用,以应用于返回布尔值的任何二进制操作。例如
List.fold (fun (nextElem, maxSoFar) ->
if nextElem > maxSoFar then nextElem else maxSoFar) (List.head theList) theList