0

我想在“[list]”模式下列出变量循环的“$ i”中的增量。那时,我可以用“[expr]”计算值。

我将在这里留下一个教学示例,以简化这个想法。看:

set i 1

while {$i <= 9} {
  global value
  set lst [puts -nonewline "$i "]
  set value [list $lst]
  incr i
}

global value
# puts [expr [lindex $value 0] + [lindex $value 1]]
puts "\n$value"

结果 在此处输入图像描述


我的困难是将这些连续的增量保持在一个变量内。

在这种模式下:

set value $i

只有最后一个增量/数字被添加到变量中。

正如我之前所说,我需要存储这些数字以便以后计算。就像是:

puts [expr [lindex $value 0] + [lindex $value 1]]

警告- “出于教学目的,我举了一个序数和序列为 '1 - 9'让可以帮助的同事非常清楚,不要建议手动编写列表。一旦我从包含 1000 行编号的文件中提取行,这意味着,我正在使用动态和非顺序问题中的数字。我只做了'1-9'来举例说明这个问题。我自己收到答案后,我会根据我的script.tcl调整解决方案。“

4

3 回答 3

1

我通过添加一个随机值i而不是增加一来使这变得更有趣。

set prev 0
set i 1
set i_values {}
set increments {}
while {$i <= 9} {
    lappend i_values $i
    lappend increments [expr {$i - $prev}]
    set prev $i
    set i [expr {$i + rand()}]
}
puts $i_values
puts $increments
1 1.5047644425671383 2.08075066845899 2.681249232814298 3.2606203524678112 3.751028369064922 4.0385633167059 4.638428318611546 5.569515346814653 6.3491983564334 6.481541018691633 6.764665592817901 7.239382933005405 7.8137194643792345 8.687802264321506
1 0.5047644425671383 0.5759862258918518 0.6004985643553078 0.5793711196535134 0.49040801659711075 0.28753494764097765 0.5998650019056466 0.9310870282031072 0.7796830096187461 0.13234266225823355 0.28312457412626824 0.474717340187504 0.5743365313738291 0.874082799942272
于 2021-11-29T17:08:34.743 回答
1

您实际上有两个选项可用于逐步构建列表。第一个是使用lappend,第二个(从 8.6 开始)是使用lsetindex end+1。或者,您可以预先构建一个正确长度的列表,lrepeat然后lset将值放入其中。

Tcl 的索引总是从零开始或从零开始end

这是一个示例,其中生成的列表的每个元素都比前两个值的总和大 1。您需要使用两个种子值初始化列表。

set myList {0 1}
for {set i 0} {$i < 10} {incr i} {
    set v1 [lindex $myList $i]
    set v2 [lindex $myList [expr {$i + 1}]]
    lappend myList [expr {$v1 + $v2 + 1}]
}
puts $myList
# 0 1 2 4 7 12 20 33 54 88 143 232

请注意,您不能使用它foreach来执行此操作;它总是迭代固定(在调用时)列表值的强调文本。

于 2021-11-29T17:54:59.413 回答
0

Glenn Jackman的回答显示了lappend将元素附加到list.

Chris Heithofflappend在他的评论中向我澄清说,在变量列表名称前使用 $ 美元符号是一个常见错误。

Donal Fellows在我陷入使用foreach- 的诱惑之前就警告过我,注意你不能foreach这样做;它总是迭代固定(在调用时)列表值的强调文本。

#!/bin/ash
# \
exec tclsh "$0" "$@"

# list
set value {}
set i 1
while {$i <= 9} {

    # Add the stdout in "$i" for list       
        lappend value $i
    
        incr i
}

# Note that in this calculation, the left side is placed the even numbers and the Right are the Odd ones.

puts [expr [lindex $value 0] + [lindex $value 1]]

puts [expr [lindex $value 2] + [lindex $value 3]]

puts [expr [lindex $value 4] + [lindex $value 5]]

puts [expr [lindex $value 6] + [lindex $value 7]]

puts [expr [lindex $value 8] + [lindex $value 9]]

结论

我变得如此依附于标准输出的出口,puts相信只有他可以通过 建立列表list,我没有意识到如果没有这两个命令我可以用任何其他方式做到这一点。

尽管我尝试使用,lappend但我坚持与使用结合使用list,除此之外,一些错误的尝试如何使用$跟随变量,例如:lapped $value $lst

现在我知道我错在哪里了,我怎么能避免花这么多时间在一个简单的解决方案上,以至于答案中显示了它。反正使用`lapp

于 2021-11-29T22:34:23.067 回答