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

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

您的问题是这一行:

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]