递归十六进制​​转换Python 3

时间:2018-11-26 17:32:04

标签: python python-3.x recursion

我制作了一个十六进制转换器来练习递归/递归思维。但是,由于函数似乎只输出当前值9的结果,因此似乎没有发生递归。代码如下:

import math
curr=0
def convert(x):
    L=len(x)
    L-=1
    sol=0
    if L == 0:
        return 0
    else:
        if x[curr]==["A","a"]:
            v=10
        elif x[curr]==["B","b"]:
            v=11
        elif x[curr]==["C","c"]:
            v=12
        elif x[curr]==["D","d"]:
            v=13
        elif x[curr]==["E","e"]:
            v=14
        elif x[curr]==["F","f"]:
            v=15
        else:
            v=int(x[curr])
        sol+=((v)*(16**(L-1)))
        return sol + convert(x[curr+1])


def main():
    print(convert('98A'))

main()

2 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

class HexMap:
    # mapping char to int
     d = { hex(n)[2:]:n for n in range(16)}

def convert(x):        
    s = 0
    # use reverse string and sum up - no need for recursion
    for i,c in enumerate(x.lower()[::-1]): 
        s += HexMap.d[c]*16**i
    return s

def main():
    print(convert('98A'))

main()

输出:

2442 

递归版本:

# class HexMap: see above 

def convert(x):       
    def convert(x,fak): 
        if not x:
            return 0
        else:
            return HexMap.d[x[-1]]*16**fak + convert(x[:-1],fak+1)
    return convert(x.lower(),0)


def main():
    print(convert('98A'))

main()

相同的输出。

答案 1 :(得分:2)

每次调用该函数时,您都要设置L = len(x)。这是一种解决方案:

    import math
    def convert(x, L):
      c = len(x) - 1
      sol=0
      if L > c:
          return 0
      else:
          if (x[L]=="A" or x[L]=="a"):
              v=10
          elif (x[L]=="B" or x[L]=="b"):
              v=11
          elif (x[L]=="C" or x[L]=="c"):
              v=12
          elif (x[L]=="D" or x[L]=="d"):
              v=13
          elif (x[L]=="E" or x[L]=="e"):
              v=14
          elif (x[L]=="F" or x[L]=="f"):
              v=15
          else:
              v=int(x[L])
          sol+=((v)*(16**(c - L)))
          print(sol)
          return sol + convert(x, L + 1)



    def main():
        print(convert('98A', 0))

    main()