所以我試圖遞回列印一個數字中所有奇數的總和。就像數字 12345 會是 9 這個代碼不起作用,但我不明白為什么。
public static int oddSum(int n){
String nn = Integer.toString(n);
if(nn.length()==1 && Integer.parseInt(nn)%2==1) {
return Integer.parseInt(nn);
} else if(nn.length()==1 && Integer.parseInt(nn)%2==0) {
return 0;
}
if((int)nn.charAt(0)%2 == 1) {
return oddSum(Integer.parseInt(nn.substring(1)) (int)nn.charAt(0));
} else {
return oddSum(Integer.parseInt(nn.substring(1)));
}
}
uj5u.com熱心網友回復:
我有點覺得這是一個家庭作業問題,但我會咬一口。
我對java不是特別了解,所以無法評論代碼的細節。但是,如果我沒看錯的話,好像你正在接受一個整數,將其轉換為字串,剝離字符并將它們回傳為整數進行處理?這似乎令人費解。
這個偽代碼呢?
int oddSum(n)
{
if (n < 10)
{
if (n%2 == 1)
return n
else
return 0
}
return oddSum(n/10) oddSum(n%10)
}
uj5u.com熱心網友回復:
根本原因?顯然,您不知道如何除錯。
直接原因?
return oddSum(Integer.parseInt(nn.substring(1)) (int)nn.charAt(0));
這條線有問題。您正在呼叫oddSum:
- 取輸入數字。去掉第一個數字。
- 現在添加第一個字符的 ASCII 碼(數字上,不是字串連接)。
對于輸入 12345,這意味著:2345 49= 2394,這毫無意義。您可能打算做的是:
- 取輸入數字。去掉第一個數字。把它喂給
oddSum. - 接受這個遞回呼叫
oddSum回傳的任何內容,并將數字的實際值添加到它(而不是它的 ASCII 碼)。
那不是您的行所做的-您的括號完全位于錯誤的位置,并且(int) nn.charAt(0)不會為您提供第一位數字的值。它會為您提供它的 ASCII 碼。0 是 48,1 是 49,依此類推。
要將 ascii 字符轉換為其數字值,您可以“數學地”執行此操作:
int valueOfFirstDigit = nn.charAt(0) - '0';
這是有效的,因為所有 9 位數字都按順序顯示在 ASCII 表中。因此,減去 0 字符的 ASCII 值會得到 0,'1' - '0'即 1,等等。
請記住,像“a”這樣的字符在計算機的記憶體中都會變成數字。那么,哪個號碼?這就是 ASCII 表的全部意義所在。字符'0'在系統中不會變成數字0;它變成了 48,這是字符 '0' 的 ASCII 碼。請記住,數字 0 根本不等于字符“0”。
修正括號問題,修正你在 ASCII 和 int 之間的混淆,你就可以正常作業了。
除錯?
您的根本原因是您需要除錯代碼。編碼實際上并不像電影。你不只是撰寫代碼并一次完成它,你也不會通過戲劇性地專注地盯著它來解決代碼的任何問題。
你除錯。
除錯很簡單。一行一行地你在腦海中弄清楚代碼應該做什么,然后你運行代碼并對比你認為它應該做什么和它實際在做什么。每當您發現差異時,太好了。您發現了 1 個錯誤。修復它,繼續前進,因為蟲子是群居動物。
除錯器讓您這樣做 - 它們為您提供單步執行工具(運行 1 行,然后暫停,直到您按下按鈕運行下一行),并讓您關注您關心的任何變數的值,讓您執行檢查實際情況的作業,以便您可以將其與您認為應該發生的情況進行比較。
如果學習使用除錯器是一座過分的橋梁,那么總是可以選擇System.out在你的代碼中扔一堆陳述句:在每一行之間添加一個,列印所有相關變數的值和所有相關運算式的結果,然后你只是浪費了大量時間來重新創建除錯器的功能。但是,您不必學習如何使用它,所以我想這是一種選擇。雖然我只是學習如何使用除錯器。
如果你這樣做了,我敢打賭,你會自己解決這個問題。
uj5u.com熱心網友回復:
更有效的方法是一次修剪第一個數字。您正在使用字串,并且 return 陳述句中的連接回傳不正確的結果。
Example of recursion:
n = 123
n % 10 will give you 3
n = n / 10 will trim the 3
n != 0, so call oddSum(12) 3 [We add the 3 to call because it is odd]
n = 12
n % 10 will give you 2
n = n / 10 will trim the 2
n != 0, so call oddSum(1) [We don't add the 2 since it is even]
n = 1
n % 10 will give you 1
n = n / 10 will give you 0
return oddSum(0) 1 [add this odd digit]
Since n == 0 -> base case reached, so the recursion stops [return 0]
Sum of all recursions will be 4.
public class SumOfOddDigits {
public static int oddSum(int n) {
/* Base case to exit recursion */
if(n <= 0) {
return 0;
}
/* Ternary statement that checks if the last digit is odd */
/* If so, call oddSum(n) and add the odd digit */
/* 'n' will be divided by 10 and passed into oddSum recursively */
return (n % 10) % 2 == 1 ? oddSum(n / 10) (n % 10) : oddSum(n /10);
}
public static void main(String[] args) {
System.out.println(oddSum(12345));
}
}
uj5u.com熱心網友回復:
如果有人好奇
public static int oddSums(int n){
if(n<10) {
if(n%2==1) {
return n;
} else {
return 0;
}
}
if((n%10)%2 == 1) {
return oddSums(n/10) (n&10);
} else {
return oddSums(n&10);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510270.html
標籤:爪哇细绳递归方法
