tcl查找列表的max元素
我是tcl新手,我正在尝试获取给定列表中的max元素 我写了一个打印最大值的函数,但它不能正常工作 这是密码tcl查找列表的max元素,tcl,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
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命令指定要设置的变量的名称max,结果如下:
set max $i
将在第一次迭代时替换为:
set max 12
看起来不错!对于未来的编程,一个很好的经验法则是,如果命令操作一个变量来设置或更新它,那么您需要传递变量的名称,而不是从中检索到的值
获取列表最大值的标准方法是一行:
set max [tcl::mathfunc::max {*}$items]
这将使用内置函数max,该函数位于::tcl::mathfunc命名空间中,并将列表中的内容作为多个参数传递,所有这些都作为一个步骤。{*}$序列是变量读取语法规则和列表扩展规则的组合,您可能还没有真正考虑到这一点。不过,编写自己的最大查找器作为学习练习仍然是一个很好的练习。您的问题是这一行:
set $max $i
在Tcl中,$字符意味着从命名变量中读取,并将该值用作命令参数的一部分。它的意思总是这样。当然,除非反斜杠被引用或在{大括号}中,否则没有例外。因此,在替换后得到的循环的第一次迭代中:
set 1 12
变量名1是合法的,但不常见,不是您想要的。为了使算法正常工作,您需要为set命令指定要设置的变量的名称max,结果如下:
set max $i
将在第一次迭代时替换为:
set max 12
看起来不错!对于未来的编程,一个很好的经验法则是,如果命令操作一个变量来设置或更新它,那么您需要传递变量的名称,而不是从中检索到的值
获取列表最大值的标准方法是一行:
set max [tcl::mathfunc::max {*}$items]
这将使用内置函数max,该函数位于::tcl::mathfunc命名空间中,并将列表中的内容作为多个参数传递,所有这些都作为一个步骤。{*}$序列是变量读取语法规则和列表扩展规则的组合,您可能还没有真正考虑到这一点。但是,编写自己的最大查找器作为学习练习仍然是一个很好的练习。set$max$i-set命令的第一个参数是什么,变量名还是变量值?另外,设置MAX的初始值的一种更安全的方法是使用列表的第一个元素:考虑所有列表元素都是负值的情况:设置MAX(LeNDX $ 0项),将MAX设置为列表中的第一个元素,我完全同意。非常感谢你!我发现我被错误地设置为max$i而不是set$max$i!!!您向我指出了一个问题,即在Tcl中查找列表的最大值是一行代码:set max[Tcl::mathfunc::max{*}$items]set$max$i-set命令的第一个参数是什么,变量名还是变量值?还有,设置MAX的初始值的一种更安全的方法是使用列表的第一个元素:考虑所有列表元素都是负值的情况:设置MAX(LeNDX $ 0项),将MAX设置为列表中的第一个元素,我完全同意。非常感谢你!我发现我被错误地设置为max$i而不是set$max$i!!!您向我指出了一个问题:无论如何,在Tcl中查找列表的最大值是一行:set max[Tcl::mathfunc::max{*}$items]