上周我的家庭作业之一是编写一个Python方法,该方法将二进制作为参数数组,然后结果将给定的二进制返回十进制。
我试图找出递归的解决方案,但截止日期之前时间已用尽,所以没有以递归的方式解决这一问题。也许解决方案很简单。我该怎么办?
我对老师收件箱的最后选择是这段代码:
def binToDec (arr):
arr.reverse()
result = 0
for x in range(0,len(arr)):
result+=arr[x]*pow(2,x)
return result
arr = [1,1,0,0]
result = binToDec(arr)
print (arr)
print (result)
所有循环都可以转换为尾递归。
def bin_to_dec(arr):
if not arr:
return 0
return arr[-1] + (bin_to_dec(arr[:-1]) << 1)
print(bin_to_dec([1, 1, 0, 0]))
输出:
12
如果您对索引感到困惑,这是更具可读性的代码:
def bin_to_dec(arr):
if not arr:
return 0
*rest, lsb = arr
return lsb + (bin_to_dec(rest) << 1)
与上面相同的输出。
首先,通常将输入数组反转作为副作用被认为是不好的做法。而且pow
在这里真的太过分了。恕我直言,迭代函数将更像Pythonic:
def binToDec (arr):
result = 0
coeff = 1
for x in reversed(arr):
result+=x*coeff
coeff *=2
return result
递归方法可以简单地通过获取最低有效位,并将其添加为数组其余值的两倍的方式来构建。在Python中,它只写:
def recursBinToDec(arr):
if 0 == len(arr):
return 0
else:
return arr[-1] + 2 * recursBinToDec(arr[:-1])
有关递归代码,请查看此链接https://www.geeksforgeeks.org/recursive-program-for-binary-to-decimal/
有一个图形表示,显示了我们必须如何添加所有值。因此,我们采用当前值,将其添加,然后对剩余项进行递归。链接上的代码是不言自明的。
无需使用递归解决方案,您可以简单地使用python函数中的内置函数,
尝试一下:
def binToDec(arr):
binary_text = "".join(map(str, arr))
return int(binary_text, 2)