2016-06-11 1 views
0

나는 두 개의 정수를 허용 재귀 함수를 써주세요. 이 함수는 첫 번째 숫자 자릿수가 두 번째 숫자와 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.재귀 자바 - 테스트 두 정수의 합계입니다 동등한 부울 함수

이 함수는 항상 true를 반환합니다.

내가 뭘 잘못하고 있니?

코드 :

public static boolean amountEqual(int num1, int num2) { 
    int sum1 = 0, sum2 = 0; 

    if (num1 == 0 && num2 == 0 && sum1 == sum2) 
     return true; 
    else if (num1 == 0 && num2 == 0 && sum1 != sum2) 
     return false; 

    sum1 += num1 % 10; 
    sum2 += num2 % 10; 

    return amountEqual(num1/10, num2/10); 
} 

감사의 내가 잘못 뭐하는 거지

+0

두 변수'sum1'과'sum2'의 목적은 무엇입니까? – tfosra

+0

각 호출에는 'sum1'과'sum2'의 고유 한 버전이 있습니다. 호출간에 상태를 공유하지 않으려는 경우 인수로 전달하십시오. 글로벌/인스턴스 바를 사용하려는 충동을 삼 간다. –

+0

sum1 = 첫 번째 숫자의 모든 자릿수의 합 Sum2 = 두 번째 숫자의 모든 자릿수의 합 – liran

답변

3

?

항상 0 인 sum을 사용하고 있습니다. sum1sum2을 전달하는 방법을 알아야 최종 호출이 이전의 모든 호출을 기반으로 결정할 수 있습니다.

네 개의 파라미터로 재귀 기능을하는 것이다하고, 상기 순환 체인을 시작하는 두 파라미터 과부하를 첨가 편도

public static boolean amountEqual(int num1, int num2) { 
    return amountEqual(num1, num2, 0, 0); 
} 
private static boolean amountEqual(int num1, int num2, int sum1, int sum2) { 
    ... // your recursive code goes here 
} 

다른 접근법이 자리 차분을 계산하고, IE는 합 num2 자릿수 num1 마이너스 합에 자리하고 차이가 0 인 경우 true를 반환 : 모든

public static boolean amountEqual(int num1, int num2) { 
    return digitDifferential(num1, num2) == 0; 
} 
private static int digitDifferential(int num1, int num2) { 
    return (num1 != 0 || num2 != 0) 
    ? num1%10 - num2%10 + digitDifferential(num1/10, num2/10) 
    : 0; 
} 
+0

FWIW는 'num1'의 자릿수가 'sum1' 및 sum2를 하나의 매개 변수 sum으로 스쿼시 할 수 있습니다. 'sum'에 더 해지고'num2'의 자릿수는'sum2'에서 뺍니다. 그러나 그것은 단지 삐딱하는 것입니다. –

+0

@MargaretBloom 아주 똑똑한 아이디어입니다! 나는 차수를 계산하고 그것이 0으로 돌아 왔을 때 '참'을 반환하는 것에 기반한 또 다른 접근법을 제안했다. 감사! – dasblinkenlight

+0

그 두 번째 접근법은 제가 방금 제안하려고했던 것입니다. 그러나 약간의 개선이있었습니다 : num1 <10 & num2 <10?을 사용하여 마지막 재귀 호출 (그리고 함께가는 div/mod 계산 추가)을 건너 뜁니다. num1 - num2 : ...' – Andreas

0

첫째, 귀하의 질문은 불분명하다. 두 숫자의 자리 합계가 같으면 함수가 true를 반환한다고 가정했습니다.

둘째, 숫자의 길이가 같고 같지 않을 수도 있습니다.

세 번째로 매개 변수로 sum1sum2을 전달하지 않습니다.

쉽게 접근 방식은 다음과 같이 두 가지 기능을하는 것입니다 :

public static int digitSum(int num) { 
    if (num > 0) { 
     return num % 10 + digitSum(num/10); 
    } 
    else 
     return 0; 
} 

public static boolean amountEqual(int num1, int num2) { 
    return digitSum(num1) == digitSum(num2); 
} 
+0

왜'/'''/'가 필요한 것이 전부입니까? ---'num (10) return num;을 수행하여 재귀 호출 건너 뛰기 – Andreas

+0

두 숫자의 길이가 같다고 가정하지 않습니다. 코드는 두 숫자가 모두 0 일 때 종료되고, 유효하지 않은 숫자는 0이므로 서로 다른 길이의 숫자가 내재적으로 지원됩니다. –

+0

@ Andreas oops, 네 말이 맞아. 편집 됨. – Marebre8

0

당신이 당신의 재귀를 추적 할 수 있습니다 제로와 함께 두 개의 새로운 변수를 초기화 amountEqual 메서드를 호출 할 때마다 코드의 첫 번째 두 라인

System.out.println(amountEqual(18,26)); 
     /* F(20,30) = F(18/10,26/10) [sum1 = 8 , sum2 = 6] 
      re init sum1 = 0 , sum2 =0 

      F(1,2) = F(1/10,2/10) [ sum1 = 1 , sum2 = 2] 
      re init sum1 = 0 , sum2 = 0 
        F(0,0) = true */