2014-09-08 2 views
1

클래스에 대한 나의 과제는 양의 정수 n으로 시작하여 1로 끝나는 Hailstone 시퀀스로 구성된 문자열을 반환하는 문자열을 반환하는 것입니다. 문자열은 일련의 숫자로 구성되어야하며 각 숫자 뒤에 단일 공백이옵니다. 시퀀스에 숫자 m (1 이외)이 나타나면 nextHailstone (m)을 따라야합니다. 예를 들어, nextHailstone (1)은 "1"을 반환하고 nextHailstone (5)는 "5 16 8 4 2 1"을 반환해야합니다.3n + 1 솔루션이 작동하지 않는 이유는 무엇입니까?

다음 코드를 가지고 있으며 무한 루프에서 멈추는 이유를 알 수 없습니다.

public static int nextHailstone (int n) 
{ 
    if (n==1) 
    { 
     return n; 
    } 
    if (n%2 == 0) 
    { 
     return n/2; 
    } 
    else 
    { 
     return ((3*n)+1); 
    } 
} 

public static String hailstones (int n) 
{ 
    String result = ""; 
    result+=n; 
    result+= ' '; 

    while (true) 
    { 
     if (result.charAt(result.length()-2)=='1') 
     { 
      return result; 
     } 
     else 
     { 
      result +=(nextHailstone(result.charAt(result.length()-2)) + ' '); 
     } 
    } 
} 

테스트 케이스 :

public void testHailstones() 
{ 
    assertEquals("1 ", hailstones(1)); 
    assertEquals("16 8 4 2 1 ", hailstones(16)); 
    assertEquals("7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 ", hailstones(7)); 
} 
+4

당신은 루프에서'때문에 경우에 박히 ((result.charAt (result.length를) - 2) == '1')'진정한 결코 – Jay

답변

1

이유 당신의 무한 당신이 잠시 동안 (사실) 루프를 가지고있다 붙어. 이것은 깨진 경우를 제외하고는 무한히 실행됩니다. if 문을 true로 설정하지 않아도 계속 실행됩니다.

1

result.charAt(result.length()-2)nextHailstone으로 전달 중입니다. 즉, char을 전달하고 nextHailstoneint 값으로 작동하며 그 숫자는 char이 아닙니다. 또한 하나의 charnextHailstone에만 전달합니다. 여러 자리 숫자는 처리하지 않습니다.

예를 들어, halstones (1)을 시도한다고 가정

당신은 "1"에 result을 설정합니다. 그런 다음 nextHailstone에 '1'을 전달합니다. 그러나 '1'문자는 49int입니다. 따라서 예상대로 1을 반환하는 대신 49*3+1=148을 반환합니다. result은 "1 148"로 업데이트됩니다.

다음 단계에서는 을 nextHailstone으로 바꾸어 '14'을 무시하고 '8'문자를 전달합니다. 루프가 종료되지 않는 이유를 알 수 있습니다.

List의 시퀀스를 int으로 저장하고 출력을 반환 할 준비가되었을 때만 String으로 변환해야합니다.

당신은 같은 것을 수행 할 수 있습니다

public static String hailstones (int n) 
{ 
    List<Integer> seq = new ArrayList<Integer>(); 
    seq.add(n); 

    while (true) 
    { 
     if (seq.get(seq.size()-1)==1) 
     { 
      return seq.toString(); // You might have to change that if you require 
            // the output in a different format 
     } 
     else 
     { 
      seq.add(nextHailstone(seq.get(seq.size()-1))); 
     } 
    } 
} 
관련 문제