3 回答
TA贡献2012条经验 获得超12个赞
你几乎正确地完成了#1(return n
无法编译),所以让我们看看#2:
考虑数字大于或等于 12 的递归情况。在这种情况下,首先使用商递归调用该方法,然后使用余数将结果(使用 + 运算符连接字符串)与另一个递归调用的结果连接起来。返回两个递归调用的串联结果。
让我们一步一步来,处理大胆的部分。
首先使用商递归调用该方法
int quotient = n / 12;
首先使用商递归调用该方法
toBase12(quotient)
使用余数的另一个递归调用的结果
int remainder = n % 12
使用余数的另一个递归调用的结果
toBase12(remainder)
[...] 并将结果(使用 + 运算符连接字符串)与 [...] 连接起来
toBase12(quotient) + toBase12(remainder)
返回两个递归调用的串联结果
我们也消除变量:
return toBase12(n / 12) + toBase12(n % 12)
正如您所看到的,作业包括您应该做什么的分步说明。您所要做的就是编写向您解释的代码。
最终结果是:
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);
}
测试
System.out.println(toBase12(298));
输出
20A
TA贡献1777条经验 获得超3个赞
在一张纸上,你可以这样写:
将输入除以十二并保存余数。
将结果再次除以十二并保存余数。
继续第二步,直到结果为零。从下到上连接每个步骤的余数。
使用您的示例输入:
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贡献1804条经验 获得超8个赞
这是一种使用尾递归来实现的方法。第二种方法会累积,直到减到零,然后返回。
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);
}
}
添加回答
举报