tcl找到列表的最大元素

时间:2018-11-18 18:29:07

标签: tcl

我是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

1 个答案:

答案 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中列表的内容作为多个参数传递,所有这些都是一步。 {*}$序列是变量读取语法规则和列表扩展规则的组合,您可能尚未真正考虑过。但是,编写自己的最大查找程序作为学习练习仍然是一个好习惯。