1, 非递归实现
/**
* 把输入的二进制数字转换成十进制返回(非递归实现)
* @param src 例如: "1111"
* @return
*/
def binaryToDecWithOutRecur(src: String): Int = {
if(!src.matches("[0|1]*")){
println("invalid input")
return 0
}
val tmp = src.reverse
var res: Int = 0
for(i <- 0 to tmp.length - 1){
res += tmp.substring(i,i+1).toInt * (1 << i)
}
res
}
2, 递归实现(线性递归)
/**
* 递归实现二进制串转换成十进制数据输出
* @param src
* @return
*/
def binaryToDecRecur(src: String): Int = {
if(!src.matches("[0|1]*")){
println("invalid input")
return 0
}
src.length match {
case 0 => 0
case 1 => src.toInt * Math.pow(2,0).toInt
case _ => binaryToDecRecur(src.substring(1,src.length)) +
src.substring(0,1).toInt * (i << src.length - 1)
}
}
3, 递归实现(尾递归)
/**
* 递归实现二进制串转换成十进制数据输出(尾递归)
* @param src
* @param res
* @return
*/
def binaryToDecTailRecur(src: String, res: Int): Int = {
if(!src.matches("[0|1]*")){
println("invalid input")
return 0
}
src.length match {
case 0|1 => res
case _ => binaryToDecTailRecur(src.substring(0,src.length-1), res + src.substring(0,1).toInt * (1 << src.length - 1))
}
}
println(binaryToDecTailRecur("111110", 0))