2014-05-20 3 views
-1

숫자의 후행 0 수를 반환해야하는이 코드가 있습니다. 내가 가지고있는 코드는 0을 반환 할 때 0을 반환합니다. 무슨 일이 일어나고 있는지 확실히 알 수 없습니다. 도움이되는 사람들?왜이 Ruby Kata는 2 대신 0을 반환합니까?

def trailing_zeros(number) 
    sort_sum = number.to_s.split(//).reverse 
    counter = 0 
    until sort_sum[counter] == "0" 
    counter += 1 
    return counter 
    end 
end 

---------- 나는 루프까지 내 내부에서 반환 카운터를 제거하고 여전히 얻을 것

편집 ------------ 결과.

I 1200에 넣으면

def trailing_zeros(number) 
    sort_sum = number.to_s.split(//).reverse 
    counter = 0 
    until sort_sum[counter] == "0" 
     counter += 1 
    end 
    return counter 
    end 
, I 2를 얻을 생각 해요,하지만 난 ----------- EDIT 0

가 계속 --------

안녕하세요, 저는 질문이 하나 더 있습니다. 그래서 위의 함수와 내가 가진이 새로운 함수가 왜 작동하지 않는지 이해하려고합니다.

def zeros(n) 
    trailing_zeros(n) if n == 1 
    zeros(n-1) * n 
end 

def trailing_zeros(number) 
    sort_sum = number.to_s.split(//).reverse 
    counter = 0 
    until sort_sum[counter] != "0" 
    counter += 1 
    end 
    return counter 

내가이 입력 0을 점점 계속 제로 (12)

을두고 난 그냥 이유를 모르겠어요. 처음에는 0으로 정의해야하는 후행 0이 있다고 생각했기 때문에 그렇지만 스택 레벨이 너무 깊은 오류가 발생했습니다. 이 라인을보고 싶습니다 :

trailing_zeros(n) if n == 1 

항상 0이 전달됩니다. 나는이 점에서 나의 기초를 알아야하기 때문에 좌절감을 느낀다. 추가 질문입니다. 스택 레벨이 너무 깊은 오류를 구성하는 것은 무엇입니까?

+0

루프 내에서 'return counter'를 사용하면 루프가 완료되기 전에 메소드가 종료됩니다. – Cereal

답변

2

루프 내의 카운터는 return이 아니어야합니다.

루프를 마친 다음 최종 counter을 반환하십시오.

또한 until을 잘못 사용하고 있습니다. until은 조건이 이면 거짓 인 (즉, puts 'a' until false이 무한대로 실행 됨) 인 동안 본체를 실행합니다. 귀하의 상태가 처음부터 사실 (0의 문자열 버전을 반대로 할 때) 0으로 끝나는 번호를 전달하면 until이 즉시 종료됩니다.

왜 대신에 시도하지 (당신의 접근 방식을 기반으로하지만, 좀 더 Rubyish가) :

def trailing_zeros(number) 
    sort_sum = number.to_s.split(//).reverse 

    counter = 0 

    sort_sum.each do |num| 
    num == '0' ? counter += 1 : break 
    end 

    counter 
end 
+0

그것은 여전히 ​​1이 아닐 것입니다 – c0d3junk13

+0

우리가 다시 쓸 수 있다면 나는 단지'number.to_s [/ 0 * $ /]. size'를 대신 쓸 것입니다 :) –

+1

@ DaniëlKnippers 물론입니다! 그러나 "카타"가되어서 나는 OP의 접근 방식을 완전히 바꾸고 싶지 않았습니다. 루비 스타일로 사고 방식을 처리하십시오. –

0

종류의 초기) 합계 [카운터] 루프가 실행되지 않습니다이 경우 "0"이 될 수 있으며, 마지막으로 계산 된 값이 반환되므로 카운터가 0으로 초기화되므로 의미가 있습니다. 루프는 결코에 루프 변경 == 0에서

2
def trailing_zeros(number) 
    sort_sum = number.to_s.split(//).reverse 
    counter = 0 
    until sort_sum[counter] != "0" 
    counter += 1 
    end 
    counter 
end 

이동 반환을 실행하지 않습니다! = 0 당신은 제로에서 실행할 때 중지 할 명확히합니다.

+0

그 트릭을 했어. 고마워. –

0

루프는 다음과 같습니다

배열에 "당신이 공을 칠 때까지"로 번역
until sort_sum[counter] == "0" 

.입력 값이 1200 인 경우 sort_sum[counter] == "0"true처음으로으로 평가되며 루프에 입력되지 않습니다.

고려, 루비 반복하지 않고이 작업을 수행하려면

0이 아닌 숫자의 배열의 첫 번째 항목을 ( Enumberable#find_index 참조) 발견
def trailing_zeros(number) 
    number.to_s.split(//).reverse.find_index{|digit| digit != "0"} 
end 

.

관련 문제