通过比较 Tcl 中每个元素的值来查找列表中的最大元素
Find Max Element in a list by comparing value of each element in Tcl
我正在尝试对列表进行排序并通过使用简单命令而不是内置命令将列表的每个元素与其他所有元素进行比较来找到最大值。
例如:
set a 9 ; set b 2 ; set c 11; set d 1
set list [list $a $b $c $d]
set max [tcl::mathfunc::max {*}$list]
11
这 returns 正确回答 11
但是当我这样做时:
for {set i 0} {$i < [llength $list]} {incr i} {
set tmp1 [lindex $list $i]
set tmp2 [lindex $list $i+1]
if {$tmp1 > $tmp2 } {
set results $tmp1
} else {
set results $tmp2
}
}
我得到“puts $results”作为 1
我尝试打印所有变量值,最后看到 tmp1 变为 1。
tmp1: 9 i: 0 tmp2: 2
tmp1: 2 i: 1 tmp2: 11
tmp1: 11 i: 2 tmp2: 1
tmp1: 1 i: 3 tmp2:
请指教我做错了什么。
提前致谢
由于这是您的学习练习,我不会给出完整的答案。
您使用 lsort -integer
对整数进行排序。然后你可以使用 lindex
从中选择一个值;您可能会发现索引 0
(第一个值)或 end
(最后一个值)很有用。
或者,循环遍历值列表的标准方法是使用 foreach
,这导致找到最大值的自然方法:
foreach val $values {
if {$val > $max} {
set max $val
}
}
但是,你需要考虑max
的初始值应该是多少;低于一切是什么意思?空列表的最大值是多少?
问题中的方法完全是我如何找到最大值,前提是我需要那个。如果我需要更复杂的东西,我可能会进行线性扫描,除非我有关于列表是否已排序的信息。
我正在尝试对列表进行排序并通过使用简单命令而不是内置命令将列表的每个元素与其他所有元素进行比较来找到最大值。
例如:
set a 9 ; set b 2 ; set c 11; set d 1
set list [list $a $b $c $d]
set max [tcl::mathfunc::max {*}$list]
11
这 returns 正确回答 11
但是当我这样做时:
for {set i 0} {$i < [llength $list]} {incr i} {
set tmp1 [lindex $list $i]
set tmp2 [lindex $list $i+1]
if {$tmp1 > $tmp2 } {
set results $tmp1
} else {
set results $tmp2
}
}
我得到“puts $results”作为 1
我尝试打印所有变量值,最后看到 tmp1 变为 1。
tmp1: 9 i: 0 tmp2: 2
tmp1: 2 i: 1 tmp2: 11
tmp1: 11 i: 2 tmp2: 1
tmp1: 1 i: 3 tmp2:
请指教我做错了什么。
提前致谢
由于这是您的学习练习,我不会给出完整的答案。
您使用 lsort -integer
对整数进行排序。然后你可以使用 lindex
从中选择一个值;您可能会发现索引 0
(第一个值)或 end
(最后一个值)很有用。
或者,循环遍历值列表的标准方法是使用 foreach
,这导致找到最大值的自然方法:
foreach val $values {
if {$val > $max} {
set max $val
}
}
但是,你需要考虑max
的初始值应该是多少;低于一切是什么意思?空列表的最大值是多少?
问题中的方法完全是我如何找到最大值,前提是我需要那个。如果我需要更复杂的东西,我可能会进行线性扫描,除非我有关于列表是否已排序的信息。