2016-11-05 5 views
0

이 스왑이 제대로 작동하지 않는 이유를 알아 내려고하고 있습니다. Ruby 변수 스왑 혼동

def partition (array, from, to) 
    #declared pivot to last index of array 
    pivot = array[to] 
    pIndex = from 
    for i in from..to-1 
     if array[i] <= pivot 
      array[i], array[pIndex] = array[pIndex], array[i] 
      pIndex += 1 
     end 
    end 
    p pivot 
    p array[to] 
    ### why doesn't this work properly? pivot is same as array[to] 
    ### array[pIndex], pivot = pivot, array[pIndex] 
    ### the swap below works 
    array[pIndex], array[to] = array[to], array[pIndex] 
    p array 
    return pIndex 
end 

가 나는 pivot = array[to]이 : 나는 이것은 퀵에 대한 파티션 방법입니다 repl.it에 값을 확인하는 p을 추가했다. 그런 다음 배열 [pIndex] : array[pIndex], pivot = pivot, array[pIndex]array[pIndex] 값이 pivot으로 변경되지만 pivotarray[pIndex]으로 변경되지 않습니다. 그러나 내가 이것을 대신 할 때 : array[pIndex], array[to] = array[to], array[pIndex] 완벽하게 작동합니다. 아무도 그 이유를 말할 수 있습니까? 갖추어

예 : 마지막 스왑 전에

arr = [7, 2, 1, 6, 8, 5, 3, 4]

partition(arr, 0,7)

배열이 일어나는 [2, 1, 3, 6, 8, 5, 7, 4]이다. 스왑의 마지막 줄은 pivot이 4이고 array[pIndex]이 6 인 것으로 가정합니다. 배열을 [2, 1, 3, 4, 8, 5, 7, 6]으로 변경해야합니다.

+0

루비 코드에서'for '를 보는 것은 매우 드문 일입니다. '(~에서 ...) .each do | i |'는 Ruby의 전형적인 예입니다. – tadman

답변

0

여기에서 병렬 할당이 수행중인 작업을 세분화합시다.

우리가 배열이 말 :

arr = [1, 2] 
arr[0], arr[1] = arr[1], arr[0] 
# arr => [2, 1] 

이 예상되는 동작입니다 - 우리는 동시에 다음과 같은 두 가지 작업을하고있다 :
arr[0] = arr[1]arr[1] = arr[0]을.

지금 우리가 지금 우리가 first = arr[1]arr[1] = first을하고 있기 때문입니다

arr = [1, 2] 
first = arr[0] 
first, arr[1] = arr[1], first 
# arr => [1, 1] 
# first => 2 

을 가정합니다.
firstarr[0]에있는 값으로 설정된 변수이며이 변수를 변경해도 배열이 변경되지 않습니다.

+1

바로 그 순간에 ... 롤. 글쎄, 아직 배우기 단계에있어! @Damon을 정리해 주셔서 감사합니다 – hockmode

+0

@hockmode np, 모든 사람들은 모든 기술 수준에서 그 순간을 가지고 있습니다 :) – Damon