我是tcl的新手,我正在尝试获取给定列表中的max元素 我写了一个函数,可以打印最大值,但是不能正常工作 这是代码
proc findmax { items } {
set max 1
foreach i $items {
if { $i > $max } {
set $max $i
}
}
puts "max is = $max"
}
我这样调用函数:
findmax $items
这是我通过的列表:
set items { 12 2 5 4 2 6 7 55 8 9 6 4}
但是它输出1而不是预期的55
答案 0 :(得分:1)
您的问题是这一行:
set $max $i
在Tcl中,$
字符表示从已命名变量进行 read 读取,并将该值用作命令参数的(可能一部分)。这意味着总是。没有例外(当然,除非用反斜杠引号或将{
大括号}
括起来)。因此,在循环的第一次迭代中,您将获得(替换后):
set 1 12
变量名1
是合法的,但是不寻常,不是您想要的。为了使算法起作用,您想给set
命令赋予要设置的变量max
的 name ,结果是:
set max $i
在第一次迭代中将被替换为
set max 12
看起来不错!将来编程的一个好的经验法则是,如果命令操作变量(设置或更新变量),则需要传递变量的名称,而不是从变量中获取的值。
获取列表最大值的标准方法是单行:
set max [tcl::mathfunc::max {*}$items]
这将使用内置函数max
(位于::tcl::mathfunc
名称空间中)并将items
中列表的内容作为多个参数传递,所有这些都是一步。 {*}$
序列是变量读取语法规则和列表扩展规则的组合,您可能尚未真正考虑过。但是,编写自己的最大查找程序作为学习练习仍然是一个好习惯。