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
命令提供要设置的变量的 name,max
,结果是:
set max $i
将在第一次迭代时替换为:
set max 12
看起来不错!未来编程的一个好的经验法则是,如果一个命令操作一个变量(设置它或更新它)那么你需要传递变量的名称,而不是从它检索的值。
获取列表最大值的标准方法是一行:
set max [tcl::mathfunc::max {*}$items]
这使用内置函数 max
(在 ::tcl::mathfunc
命名空间中)并将 items
中的列表内容作为多个参数传递,全部作为一个步骤. {*}$
序列是可变读取语法规则与列表扩展规则的组合,您可能还没有真正考虑过。然而,编写自己的最大值查找器作为学习练习仍然是一个很好的练习。
我是 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
命令提供要设置的变量的 name,max
,结果是:
set max $i
将在第一次迭代时替换为:
set max 12
看起来不错!未来编程的一个好的经验法则是,如果一个命令操作一个变量(设置它或更新它)那么你需要传递变量的名称,而不是从它检索的值。
获取列表最大值的标准方法是一行:
set max [tcl::mathfunc::max {*}$items]
这使用内置函数 max
(在 ::tcl::mathfunc
命名空间中)并将 items
中的列表内容作为多个参数传递,全部作为一个步骤. {*}$
序列是可变读取语法规则与列表扩展规则的组合,您可能还没有真正考虑过。然而,编写自己的最大值查找器作为学习练习仍然是一个很好的练习。