3 回答

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
你幾乎正確地完成了#1(return n
無(wú)法編譯),所以讓我們看看#2:
考慮數(shù)字大于或等于 12 的遞歸情況。在這種情況下,首先使用商遞歸調(diào)用該方法,然后使用余數(shù)將結(jié)果(使用 + 運(yùn)算符連接字符串)與另一個(gè)遞歸調(diào)用的結(jié)果連接起來(lái)。返回兩個(gè)遞歸調(diào)用的串聯(lián)結(jié)果。
讓我們一步一步來(lái),處理大膽的部分。
首先使用商遞歸調(diào)用該方法
int quotient = n / 12;
首先使用商遞歸調(diào)用該方法
toBase12(quotient)
使用余數(shù)的另一個(gè)遞歸調(diào)用的結(jié)果
int remainder = n % 12
使用余數(shù)的另一個(gè)遞歸調(diào)用的結(jié)果
toBase12(remainder)
[...] 并將結(jié)果(使用 + 運(yùn)算符連接字符串)與 [...] 連接起來(lái)
toBase12(quotient) + toBase12(remainder)
返回兩個(gè)遞歸調(diào)用的串聯(lián)結(jié)果
我們也消除變量:
return toBase12(n / 12) + toBase12(n % 12)
正如您所看到的,作業(yè)包括您應(yīng)該做什么的分步說(shuō)明。您所要做的就是編寫(xiě)向您解釋的代碼。
最終結(jié)果是:
public static String toBase12(int n) {
if (n < 10)
return Integer.toString(n); // or String.valueOf(n) or "" + n
if (n == 10)
return "A";
if (n == 11)
return "B";
return toBase12(n / 12) + toBase12(n % 12);
}
測(cè)試
System.out.println(toBase12(298));
輸出
20A

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
在一張紙上,你可以這樣寫(xiě):
將輸入除以十二并保存余數(shù)。
將結(jié)果再次除以十二并保存余數(shù)。
繼續(xù)第二步,直到結(jié)果為零。從下到上連接每個(gè)步驟的余數(shù)。
使用您的示例輸入:
298 / 12 = 24 rem 10 (A) 24 / 12 = 2 rem 0 2 / 12 = 0 rem 2
因此
298 in base 10 = 20A in base 12

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
這是一種使用尾遞歸來(lái)實(shí)現(xiàn)的方法。第二種方法會(huì)累積,直到減到零,然后返回。
public class Base12 {
public static String toBase12(int n) {
return toBase12(n, "");
}
private static String toBase12(int n, String value) {
return n <= 0 ? value : toBase12(n/12, toBase12Char(n%12) + value);
}
private static char toBase12Char(int n) {
return n == 11 ? 'B' : (n == 10 ? 'A' : Integer.toString(n).charAt(0));
}
}
public class Base12Test {
@Test
public void Test20A() {
int n = 298;
String expectedValue = "20A";
String actualValue = Base12.toBase12(n);
Assert.assertEquals(expectedValue, actualValue);
}
}
添加回答
舉報(bào)