2012-03-29 1 views
8

내가 루비로 변환하는 방법루비에서 반복으로 몇 번의 반복을 건너 뛰는 방법은 무엇입니까?

for(i = 0; i < 10; i++){ 
    printf("Hello"); 
    if(i == 5){ 
     a[3] = a[2] * 2; 
     if(a[3] == b) 
      i = a[3];   //Skip to index = a[3]; depends on runtime value 
    } 
} 

아래의 C 코드가 있다고 가정? 우리가 next을 사용하여 하나의 반복을 건너 뛸 수 있다는 것을 알고 있지만, 조건부 값에 따라 몇 번의 반복을 건너 뛰고 런타임 전에 건너 뛸 반복 횟수를 모릅니다.

나는 값이 0.1 (0.1 것이다 다르다는 점 배열의 "직선"을 찾고 : 여기


은 (Coreyward에서 언급 한 바와 같이) 실제로 일하고 코드입니다 "직선"으로 간주). 범위는 긴 "선"으로 간주되기 위해 50보다 길어야합니다. 라인 범위 [a, b]를 찾았 으면, 상한선 b를 반복하지 않으므로 +1에서 다시 시작하지 않고 b + 1에서 새로운 "직선"을 찾습니다.

for(i=0; i<arr.Length; i++){ 
    if(arr[i] - arr[i + 50] < 0.1){ 
    m = i;         //m is the starting point 
    for(j=i; j<arr.Length; j++){    //this loop makes sure all values differs less than 0.1 
     if(arr[i] - arr[j] < 0.1){ 
     n = j; 
     }else{ 
     break; 
     } 
    } 
    if(n - m > 50){       //Found a line with range greater than 50, and store the starting point to line array 
     line[i] = m 
    } 
    i = n          //Start new search from n 
    } 

}

+2

을 제공합니다 당신이 달성하려고하는 일의 의도를 제공하는 경우가 훨씬 더 도움이 될 것입니다. Enumerator 클래스에는 다음 반복 ('feed')의 값을 설정하고 다음 값 ('peek')을 볼 수있는 꽤 편리한 메소드가 있습니다. 또한 'for' 루프를 사용할 수 있습니다. 루비. 나는이 글을 쓰는 더 깨끗한 방법이 있다고 확신한다. 나는 그것이 무엇을하려고하는지 알지 못한다. – coreyward

+0

C에서 배열의 끝에서부터 인덱스를 만들려고합니다. 아마 바운드를'arr.Length-50'으로 바꾸고 싶을 것입니다. 이것은 값이 초기 값의 ε을 갖는 50 개 이상의 런을 찾는 다소 복잡한 방식과 같습니다. – dbenhur

+0

큰 색인의 값이 더 낮은 색인의 값보다 작다고 가정하는 것 같습니다. 사실입니까? – dbenhur

답변

2

또 다른 방법은 enumerator 클래스를 사용하고 있습니다 :

iter = (1..10).to_enum 
while true 
    value = iter.next 
    puts "value is #{value.inspect}" 
    if value == 5 
    3.times {value = iter.next} 
    end 
end 

value is 1 
value is 2 
value is 3 
value is 4 
value is 5 
value is 9 
value is 10 
StopIteration: iteration reached at end 
     from (irb):15:in `next' 
     from (irb):15 
     from C:/Ruby19/bin/irb:12:in `<main>' 
+0

이것은 귀엽다. 그러나 색인을 직접 전진시키는 것과 동등한 것은 아니다. 만약 i가 배열을 반복하면서 인덱스 j로 진행하기를 원하는 결정에 이르면,'(j-i) × iter.next '를 실행하는 것은'i = j'를 할당하는 것보다 복잡하고 비싸다. – dbenhur

3

귀하의 경우 쉽게 전형적인 루비 반복자에 포함되지 않지만, 루비도 보통이 완전히 커버 할 수있는 루프 동안 C-합니다. 다음은 위의 for 루프와 동일합니다.

i = 0; 
while i < 10 
    puts "Hello" 
    if i == 5 
    a[3] = a[2] * 2 
    i = a[3] if a[3] == b 
    end 
    # in your code above, the for increment i++ will execute after assigning new i, 
    # though the comment "Skip to index = a[3]" indicates that may not be your intent 
    i += 1 
end 
+0

예, 작동하지만 열거 자와 함께 할 수있는 방법이 있습니까? 나는'drop'에 대해 생각하고 있었기 때문에 5와 3 사이의 값을 떨어 뜨릴 것이지만, 코딩을 시작할 때 혼란스럽고 잃어 버렸습니다. – texasbruce

관련 문제