【发布时间】:2016-01-26 23:21:57
【问题描述】:
我有一个未知的模式,并且给我的 getCombos proc 提供了未知数量的数据。
我需要找到一种方法,在模式允许的范围内递归地在数据中生成尽可能多的匹配项。
例如:
# pattern | data
# {0 1 2} {0 {{A B C} {AA BB CC}}\
1 {{D E F} {DD EE FF}}\
2 {{G H I} {GG HH II}}\
}
# returns this list: (split out on multiple lines are for your viewing pleasure)
{ A E I }\
{ A E II }\
{ A EE I }\
{ A EE II }\
{ AA E I }\
{ AA E II }\
{ AA EE I }\
{ AA EE II }\
数据将始终是一个字典列表,其中键从 0 到 n。
模式始终是 0 到 n 的某种混合(在本例中为 {0 1 2} 或 {2 0 1} 等)。
这就是我认为我不能使用简单递归的原因——因为我不知道模式中有多少元素,也不知道数据下的每个值中有多少元素,我也不知道数据中有多少键。
我唯一知道的是,数据值元素中的元素数量与模式中的元素数量相匹配(例如,[llength {0 1 2}] 是 3,[llength {A B C}] 是 3),这非常重要,因为我按此顺序从$data 提取数据。
请允许我举一个反例来突出模式影响它的方式:
# pattern | data
# {1 2 1} {0 {{A B C} {AA BB CC}}\
1 {{D E F} {DD EE FF}}\
2 {{G H I} {GG HH II}}\
}
# returns this list: (split out on multiple lines are for your viewing pleasure)
{ D H F }\
{ D H FF }\
{ D HH F }\
{ D HH FF }\
{ DD H F }\
{ DD H FF }\
{ DD HH F }\
{ DD HH FF }\
正如您在上面的示例中看到的那样,[dict get $data 0] 从未输入过任何等式。模式的第一个索引对应于值列表中第一个分组中的第一项(A A A D DD G 和 GG),第二个匹配第二个(B BB E EE H 或 HH),第三个匹配第三个(C CC F FF I 或 II)。这些索引的实际值与应该使用的键匹配。
最后我需要根据模式的适当数据的每一种组合。
相当混乱。这是我一直在走的路,但正如你所见,我还远远没有任何有价值的东西:
proc getCombo {pattern data} {
set g yes
set i 0 ;# These counters must be replaced by recursive design
set j 0
set k 0
set p 0
while {$g} {
puts [lindex [lindex [dict get $data $i] $j] [lindex $pattern $p]]
puts " [lindex [lindex [dict get $data $j] $k] [lindex $pattern $p]]"
if {$k == [llength [dict get $data $i]] } {
set k 0
set g no
}
if {$j == [llength [dict get $data $i]] } {
set j 0
incr k
incr p
}
incr j
}
#########################
for {set z 0} {$z < [llength [dict get $data 0]]} {incr z} {
for {set o 0} {$o < [llength [dict get $data 1]]} {incr o} {
for {set t 0} {$t < [llength [dict get $data 2]]} {incr t} {
for {set p 0} {$p < [llength $pattern]} {incr p} {
}
}
}
}
########################
#foreach pat $pattern {
foreach key [dict keys $data] {
}
#}
########################
#return $newdata
}
有人知道我可以在这里做什么吗?我花了一整天的时间才想出上面的代码,我感觉没有更接近,但我现在有一种感觉,如果我要产生我想要的东西,我的 proc 需要递归。
感谢您给我的任何建议或指导!
【问题讨论】:
标签: algorithm recursion tcl permutation