下面給出的代碼適用于兩位數,即最多 99,但我不知道為什么在那之后它會中斷。例如。它給出了 51 作為數字 123 的輸出,但它應該是 321。任何人都可以幫助我嗎?
public class Main
{
static int reverse(int n){
if(n<10)
return n;
else
return ((n%10)*10) (reverse(n/=10));
}
public static void main(String[] args) {
System.out.println(reverse(123));
}
}
uj5u.com熱心網友回復:
你在做數學加法,使用字串連接會更容易
static String reverse(int n) {
if (n < 10)
return "" n;
else
return "" n % 10 reverse(n / 10);
}
uj5u.com熱心網友回復:
對于n123:n % 10 * 10產生 30。接下來你除以 10,得到 12,你在遞回呼叫中傳遞它。由于您的方法適用于 2 位數字,因此您正確地得到 21。30 21 等于 51。
僅使用數學的遞回方法(而不是例如字串操作)并不是那么簡單。我想我會求助于迭代解決方案。如果您想將此問題用于訓練遞回,您可能應該按照 azro 的建議研究字串操作。
為了說明結合數學和遞回的挑戰,想想你將如何反轉 102。期待 201。有兩種方法:
- 要么將 10 傳遞給遞回呼叫并將結果附加到 2。10 的反面是 01,您將得到 1,因此天真的解決方案將為您提供 21,而不是 201。可能有一種方法可以知道遞回呼叫的中間結果應該理解為兩位數,你需要有創意。
- 或者您將 02 傳遞給遞回呼叫并將 1 添加到結果中。再一次,天真的方法會產生 21,而不是 201。
uj5u.com熱心網友回復:
您只能反向將最后一位清零。這僅適用于小于 100 的數字(使用單個遞回呼叫)。
uj5u.com熱心網友回復:
問題出在((n)*10) . 這部分應該將最后一位數字與相反的數字連接起來,但它只會將數字乘以十并求和。對于兩位數的數字,它是有效的,因為乘以 10 實質上是將數字放在第一位的第二位。但它不適用于比這更大的數字。
您應該改為連接字串。
uj5u.com熱心網友回復:
如果你想要一個純粹基于數學的解決方案,你可以這樣做。
div是 10 的冪增加到當前位數。- 然后你向后建立這個數字。要了解這是如何作業的,請在遞回呼叫之前和之后放入一些列印陳述句。
public static int reverse(int n) {
int rev = 0;
if (n > 0) {
int div = (int)Math.pow(10,(int)(Math.log10(n)));
rev = 10 * reverse(n%div) n/div;
}
return rev;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/384994.html
