转换为十六进制使用递归的十进制值

我在这一个完全难住了。 我不得不利用当前的代码结构,以用户输入的十六进制值转换为使用递归十进制值。 对于递归调用的方法的标题不能被改变。 我有这个想通了,而无需使用递归的,但对我的生活不能换我身边我会怎么做这个头。

//编辑 - 解决

public class hextodecimal { public static void main(String[] args) { // Test out the parsing with values from page 719 System.out.println(hexToDecimal("7F")); System.out.println(hexToDecimal("FFFF")); System.out.println(hexToDecimal("431")); } public static int hexToDecimal(String hexString) { return hexToDecimal(hexString, 0, hexString.length() - 1); } public static int hexToDecimal(String hexString, int end, int hexLength) { if (hexLength < end) return 0; else { int decValue; if (hexString.charAt(hexLength) == 'A') decValue = 10; else if (hexString.charAt(hexLength) == 'B') decValue = 11; else if (hexString.charAt(hexLength) == 'C') decValue = 12; else if (hexString.charAt(hexLength) == 'D') decValue = 13; else if (hexString.charAt(hexLength) == 'E') decValue = 14; else if (hexString.charAt(hexLength) == 'F') decValue = 15; else decValue = hexString.charAt(hexLength) - '0'; return hexToDecimal(hexString, end, hexLength - 1) * 16 + decValue; } } }

--------------解决方案-------------

只有两种选择。 过程中最左边的字符,并通过递归子(1)给自己,或处理最右边的字符,并传递什么是向左递归自己。 这应该是足够的暗示的。

假设你有使用递归, 不能使用Integer.parseInt()您已经了解并会打败问一个问题的目的),这就是你怎么去了解它:

当创建一个递归函数,你需要终止条件,并得到该终止条件的一种方式。 既然你显然需要使用该方法签名,你的终止条件将不得不进行一次hexString是空的,已经通过了之后String在每个递归1少的性格。

如果hexString是空的,它会是有意义的返回0(如果你看过下面首先它可能会更有意义)。

应该每次处理最显著数字,并乘以所解析值16 ^ (length_of hexString - 1) 16因为进制的基数为16,提高了对位位置的力量 - 因为一旦你有数字和它的位置(即几十,几百,几千)你会做十进制10 ^ X同样的原因1。 该长度String为我们提供了这一立场。 看一下例子底部,如果你不明白我的意思。

现在,你需要分析这个角色的方法。 一个简单的方法是使用一个Map到每个十六进制映射charint的是十进制表示,但你也可以使用if或者switch语句。 如果char不是有效的十六进制数字,抛出异常。

一旦你有了这个值,将它添加到的返回值hexToDecimal ,即value + hexToDecimal()String被传递给hexToDecimal是修改的范围内当前字符串[1, length] ,其中(如我上面提到的)第一个字符砍掉。

注:想想为什么你不能从最低显著数字(右)使用该方法签名处理。 你将如何能够繁殖的基础上它的位置给它正确的值的十六进制数字?

7F ,这是在十进制127。

  • 为0x7 = 7
  • 0xF的= 15

数量不是7 + 15,但7 *(16 ^ 1)+ 15!

RTFM! 在这里,距离的Javadoc的Integer.parseInt(字符串,INT)增强的摘录:

解析字符串参数在第二个参数指定的基数中的一个符号整数。

我认为这里的关键是要实现每一个数字的意义。 例如, F00D十六进制是:

F * (16 ^ 3) //Fourth digit
plus
0 * (16 ^ 2) //Third digit
plus
0 * (16 ^ 1) //Second digit
plus
D * (16 ^ 0) //First digit

换一种说法:

(15 * (16^3)) + 0 + 0 + 13

要么:

61440 + 0 + 0 + 13 = 61453

因此在每一步,则提高16到其序列中位置的力量。

您可以使用字符串的长度要弄清楚什么地方你在,并将余下的数字下一次迭代。 每个功能将递归增加的结果。

例如:

  1. 第一次迭代将采取F00D并返回61440 + hexToDecimal("00D")
  2. 在第二次迭代将采取00D并返回0 + hexToDecimal("0D")
  3. 第三次迭代将0D并返回0 + hexToDecimal("D")
  4. 在第四次迭代将采取D并返回13 ,并且不再调用自身由于串的长度为1。

现在只写代码! :)

如果这是一个1位十六进制数(0-F),那么这将是容易解析。 你可以用一个开关做。

如果这是一个N> 1位十六进制数那实在是太辛苦。 将它分成两个数字 - 正1位数字和一个1位数字。

分类:java的 时间:2015-03-15 人气:1
本文关键词: Java中,递归
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.002 (s). 10 q(s)