2014-11-13 2 views
0

Мне нужно вычислить декартово произведение двух списков.Печать Декартовое произведение двух списков, без вложенных foreach

Мой список содержит большое количество элементов, поэтому вложенные foreach не очень хорошая идея в моем случае.

Что-нибудь еще, что можно использовать там?

+4

Слово на улице в том, что вы не можете уйти от сложности продукта (смотри, например, http://stackoverflow.com/a/1741391/488796). Есть способы ускорить процесс, но нужна дополнительная информация. Насколько велика "большая"? Является ли ваш код в строках сценария, или это в 'proc', который вы вызываете (это имеет значение для байт-кодирования)? –

ответ

1

Возможно, вы сможете работать над значениями, пока они собраны вместе. Трудно сказать, по крайней мере, снимок структуры, с которой вы работаете. Вот простой пример.

Проц не возвращает матрицу, которая работает с точками в матрице.

proc my_cartesian {a b} { 

    set len_a [llength $a] 
    set len_b [llength $b] 
    set len [expr $len_a * $len_b] 
    set y 0 
    for {set i 0} {$i < $len} {incr i} { 
     set x [expr $i % $len_a] 
     if {$x == 0 && $i != 0} { 
      incr y 
     } 
     set px [lindex $a $x] 
     set py [lindex $b $y] 

     # Your code 
     puts "$px, $py" 
    } 

} 

my_cartesian {a b c} {1 2 3} 

выход:

a, 1 
b, 1 
c, 1 
a, 2 
b, 2 
c, 2 
a, 3 
b, 3 
c, 3 
Смежные вопросы