2016-06-11 31 views
0

我寫了一個接受兩個整數的遞歸函數。如果第一個數字的數量等於第二個數字,該函數返回true,否則該函數返回false。遞歸java - 測試是兩個整數的和是相等的布爾函數

函數總是返回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

我在做什麼錯?

您正在使用的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 
} 

的另一種方法是計算數字微分,的即總和位在num2數字num1減去總和,並返回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'中,'num2'中的數字從'sum2'中減去。但這只是挑剔。 –

+0

@MargaretBloom這是一個非常聰明的主意!我提出了另一種基於計算數字差分的方法,並在返回爲零時返回「真」。謝謝! – dasblinkenlight

+0

第二種方法就是我剛剛提出的方法,但略有改進:通過執行num1 <10 && num2 <10來跳過最後一次遞歸調用(以及與之一起使用的額外的div/mod計算) num1 - num2:...' – Andreas

0

首先,你的問題還不清楚。我假設你想要函數返回真如果兩個數字的數字相等。

其次,你假設數字長度相等,他們可能不是。

第三,你沒有通過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

爲什麼'/ ='當你只需要'/'? ---通過執行'if(num <10)return num;' – Andreas

+0

來跳過遞歸它們並不假定兩個數字具有相同的長度。當兩個數字都爲零時,代碼終止,爲true,但由於非有效數字爲零,因此隱式支持具有不同長度的數字。 –

+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 */