2016-09-24 2 views
1

저는 Ruby를 배우기 위해 온라인 연습 문제를 해결하기 위해 노력하고 있습니다.이 문제를 해결할 수 있었지만 변수 선언 배치에 대해 이해하려고 애 쓰고 있습니다.Ruby에서 변수 선언 배치 (초보자)

idx2 while-loop 내부에 "pair"(배열 인덱스 합계)를 선언하거나 정의 할 때 다음 코드가 작동하는 이유는 무엇입니까?하지만 인덱스 자체를 선언 한 직후에는 어떻게됩니까?

def two_sum(nums) 
    idx=0 
    idx2=0 
    while idx<nums.length-1 
    idx2=idx+1 
    while idx2<nums.length 
     pair=nums[idx]+nums[idx2] 
     if pair==0 
     return [idx, idx2] 
     else 
     idx2+=1 
     end 
    end 
    idx+=1 
    end 
end 

위 버전은 작동하지만 아래 구조는 작동하지 않습니다.

def two_sum(nums) 
    idx=0 
    idx2=0 
    pair=nums[idx]+nums[idx2] 
    while idx<nums.length-1 
    idx2=idx+1 
    while idx2<nums.length 
     if pair==0 
     return [idx, idx2] 
     else 
     idx2+=1 
     end 
    end 
    idx+=1 
    end 
end 

누구든지 이에 대한 설명이나 일부 보급형 리소스를 제공 할 수 있다면 크게 감사하겠습니다. 감사.

편집 : 원하는 출력에 대한 들여 쓰기와 특이도 문제

죄송합니다. 나는 이것에 완전히 새롭다, 때때로 세부 사항은에 의해 미끄러진다, 나는 의견을 평가한다. 단계별 논리적 실행을 주셔서 감사합니다. 정확히 내가 찾고 있었던 것입니다.

+2

'직장'이란 무엇입니까? 예상되는 입력/출력 값은 무엇입니까? – fylooi

+0

은 들여 쓰기를 수정하기 위해 코드를 편집했습니다. 두 번째 예제에서'pair' 변수는'while'을 반복 할 때마다 같은 값을 갖습니다. 처음에는 'idx2'가 증가 할 수 있기 때문에 바뀔 수 있습니다. 좋은 사용자 이름 btw :) –

답변

1

한 번에 하나씩 작동 코드와 손상된 코드를 살펴 보겠습니다.

우리가 지금

idx = 0, idx2 = 0 

을 시작할 때의 우리가 처음에 nums = [1, 2, -1, 3]

Supposably 작업 코드

1 def two_sum(nums) 
2 idx = 0 
3 idx2 = 0 
4 
5 while idx < nums.length-1 
6  idx2 = idx+1 
7  while idx2 < nums.length 
8  pair = nums[idx] + nums[idx2] 
9  if pair == 0 
10   return [idx, idx2] 
11  else 
12   idx2 += 1 
13  end 
14  end 
15  idx += 1 
16 end 
17 end 

을 가정 해 봅시다 루프 (6 호선)

idx = 0, idx2 = 1 
동안

루프 (8 호선)

idx = 0, idx2 = 1, pair = nums[0] + nums[1] = 3 

pair != 0, 그래서 우리는 else 문에 지금있는 동안 2. (라인 12) 우리 이제 루프 다시 2 차에 루프 (다시 라인 8)

idx = 0, idx2 = 2, pair = nums[0] + nums[2] = 0 

pair == 0, 그래서 우리는 [0, 2]를 반환 (라인 10)

이 방법 동안

idx = 0, idx2 = 2, pair is still 3 

코드가 실행되고 있다고 가정합니다.

깨진 코드 우리는 다시 같은 논리를 통해 실행됩니다

1 def two_sum(nums) 
2 idx = 0 
3 idx2 = 0 
4 pair = nums[idx] + nums[idx2] 
5 while idx < nums.length-1 
6  idx2 = idx+1 
7  while idx2 < nums.length 
8  
9  if pair == 0 
10   return [idx, idx2] 
11  else 
12   idx2 += 1 
13  end 
14  end 
15  idx += 1 
16 end 
17 end 

.

루프 (2 라인 - 4) 동안 우리는 첫 번째 공격하기 전에 우리가 처음에

idx = 0, idx2 = 0, pair = nums[0] + nums[0] = 2 

이제 while 루프 (6 호선) 초에 지금

idx = 0, idx2 = 1, pair = 2 

그리고 루프 동안 , pair != 0는, 그래서 우리는 일에 이제 루프 다시 else 문 (라인 12)

idx = 0, idx2 = 2, pair = 2 

충돌 두 번째 while 루프의 예술. pair != 2이므로 else 문을 쳤습니다.

idx = 0, idx2 = 3, pair = 2 

pair != 0

는, 그래서 우리는 else 문을했다.

idx = 0, idx2 = 4, pair = 2 

은 그래서 지금, idx2 < nums.lengthfalse, so we exit the second while loop, and now IDX = 1`, 우리는주기를 계속합니다. 당신이 while 루프의 pair 외부를 선언하기 때문에 당신이 if 문에 충돌하지 않도록 pair 결코 동일 제로 물론하지 않는 한, 당신은 0에를 얻을 수 있기 때문에

당신이 볼 수 있듯이, 그것은 결코, 서로 다른 값을 다시 계산하지 초기 합계.

while 루프는 필요한 루프 수를 잘 모르는 경우를위한 것입니다. 예를 들어, 사용자 항목을 확인하는 경우, 사용자가 항목을 올바르게 가져 오는 시점에 따라 루프를 한 번 또는 10 번 반복해야 할 수도 있습니다. 이 경우 정확히 몇 번 실행해야하는지 알 수 있습니다. 그래서 반복자가 여기있는 일에 더 좋습니다.

작성 방법에 대한 예는 다음과 같습니다. 이렇게하는 것이 더 좋은 방법 일 수 있음을 명심하십시오. 예를 보여 드리겠습니다.

def two_sum(nums) 
    nums.each_with_index do |num1, idx1| 
    nums.each_with_index do |num2, idx2| 
     next if idx1 == idx2 
     return [idx1, idx2] if num1 + num2 == 0 
    end 
    end 
end