2014-11-13 2 views
0

두리스트의 데카르트 곱을 계산해야합니다.중첩 된 foreach없이 두리스트의 Cartesian 제품

내 목록에 많은 수의 요소가 포함되어 있으므로 foreach 중첩 사례는 좋지 않습니다.

다른 용도로 사용할 수 있습니까?

+4

말씀이 볼 http://stackoverflow.com/a/1741391/488796). 일들을 빠르게하는 방법이 있지만 더 많은 정보가 필요합니다. "큰"크기는 얼마입니까? 코드가 스크립트의 라인에 있는지 또는 호출중인'proc'에 있는지 (바이트 코드에 대해 중요)? –

답변

1

값을 조합하는 동안 작업 할 수 있습니다. 적어도 작업중인 구조의 스냅 샷 없이는 말하기 어렵습니다. 다음은 간단한 예입니다.

proc는 행렬의 점에서 작동하는 행렬을 반환하지 않습니다.

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