這個問題最好是遞歸處理。特別是,爲特定計數器生成計數會導致回調以處理鏈中的下一個計數器。需要注意的是按照正確的順序將結果拼湊在一起(有幾種方法可以實現),但下面的方法很好,因爲它將數據生成爲列表列表,從而可以對其進行進一步處理,根據您的選擇打印。
請注意使用默認參數關閉遞歸。通過使用包裝程序可以避免這種情況,但這是一種改進。
proc genseq {definition {current {}}} {
# Get the next part of the definition
lassign [lindex $definition 0] columns prefix limit
set definition [lrange $definition 1 end]
set result {}
for {set i 0} {$i < $limit} {} {
# Handle the appending of bits relating to the counter at the current level
set cur $current
foreach c $columns {
lappend cur "$prefix$i"
incr i
}
# If we have more definition to process, recursive call. Otherwise just accumulate
if {[llength $definition] > 0} {
lappend result {*}[genseq $definition $cur]
} else {
lappend result $cur
}
}
return $result
}
讓我們來測試一下:
set seqinfo {
{{XD} PD 2}
{{XB} PB 4}
{{XA0 XA1} PA 4}
}
# A bit of trickery to get approximately the right output format
puts \{\{[join [genseq $seqinfo] "\}\n\{"]\}\}
,輸出結果。
{{PD0 PB0 PA0 PA1}
{PD0 PB0 PA2 PA3}
{PD0 PB1 PA0 PA1}
{PD0 PB1 PA2 PA3}
{PD0 PB2 PA0 PA1}
{PD0 PB2 PA2 PA3}
{PD0 PB3 PA0 PA1}
{PD0 PB3 PA2 PA3}
{PD1 PB0 PA0 PA1}
{PD1 PB0 PA2 PA3}
{PD1 PB1 PA0 PA1}
{PD1 PB1 PA2 PA3}
{PD1 PB2 PA0 PA1}
{PD1 PB2 PA2 PA3}
{PD1 PB3 PA0 PA1}
{PD1 PB3 PA2 PA3}}
我會放在標題和額外的空間行作爲練習。 (另外,Tcl沒有用逗號分隔列表;實際上,逗號是普通字符,在表達式之外對它們沒有什麼特別之處。)
你有什麼嘗試?將XA1設置爲單獨的映射條目將使您的生活更輕鬆。 –
這是一個非平凡的轉換,正是因爲來自單個序列計數器的值在多列中使用的方式。 –