tcl 查找列表的最大元素

tcl find the max element of a list

我是 tcl 的新手,我正在尝试获取给定列表中的最大元素 我写了一个打印最大值的函数,但它不能正常工作 这是代码

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

你的问题是这一行:

set $max $i

在 Tcl 中,$ 字符表示 从命名变量中读取 并将该值用作(可能是一部分)命令的参数。意思就是这个总是。没有例外(当然,除非反斜杠引号或在 { 大括号 } 中)。因此,在循环的第一次迭代中(替换后):

set 1 12

变量名1是合法的,但不正常,不是你想要的。为了使算法起作用,您反而想为 set 命令提供要设置的变量的 namemax,结果是:

set max $i

将在第一次迭代时替换为:

set max 12

看起来不错!未来编程的一个好的经验法则是,如果一个命令操作一个变量(设置它或更新它)那么你需要传递变量的名称,而不是从它检索的值。


获取列表最大值的标准方法是一行:

set max [tcl::mathfunc::max {*}$items]

这使用内置函数 max(在 ::tcl::mathfunc 命名空间中)并将 items 中的列表内容作为多个参数传递,全部作为一个步骤. {*}$ 序列是可变读取语法规则与列表扩展规则的组合,您可能还没有真正考虑过。然而,编写自己的最大值查找器作为学习练习仍然是一个很好的练习。