2014-10-10 63 views
0

我试图编写一个函数bin_to_dec(s),它接收一个二进制数的字符串并将其转换为相应的十进制数/整数。Python中的封闭函数

我知道有可能建立在这种转换方式,但我试图通过递归来实现它。这是我迄今编程的内容

我不断收到内存错误。我如何编辑我的最后陈述来完成这项工作?

+0

我觉得他在这里弄得有些变量名.... – aruisdante 2014-10-10 16:37:42

+1

递归通常意味着你从什么地方调用函数内部本身 – 2014-10-10 16:37:44

+1

我不知道为什么你认为你需要成倍的单曲结果[0] '在这里2点;最低有效位是0或1,而不是0或2. – 2014-10-10 16:38:02

回答

3

我会避免递归,它不是你想要做的事情所必需的。我的东西去像

def binToDec(s): 
    total = 0 
    for index, value in enumerate(s[::-1]): 
     total += int(value) * 2**index 
    return total 

>>> binToDec('1100') 
12 

同样的想法,用列表比较:

def binToDec(s): 
    return sum(int(value) * 2**index for index,value in enumerate(s[::-1])) 

如果你真的想递归地做到这一点

def binToDec(s): 
    if len(s) == 1: 
     return int(s) 
    else: 
     return binToDec(s[-1]) + 2*binToDec(s[:-1]) 
+0

无论如何,您可以通过检查它是否为零来节省昂贵的''**''。 – aruisdante 2014-10-10 16:40:28

+0

嘿,我使用python,从来没有见过这种语法'[: - 1]',你会介意点一些源?谢谢。 – joaoricardo000 2014-10-10 16:41:39

+0

它被称为[切片](https://docs.python.org/2/tutorial/introduction.html)。语法是''[start:stop:step]'',其中一个空值被假定为''[0:len(list):1]''。请注意,* stop *是排他性的,因此''[0:2]''会让您获得前两个元素,而不是前三个元素。 – aruisdante 2014-10-10 16:42:48

0
import math 
def bin_to_dec(s): 
if s == '0': 
    return 0 
elif s == '1': 
    return 1 
elif s[0] == '0': 
    return bin_to_dec(s[1:]) 
else: 
    return int(math.pow(2, len(s) - 1)) + (bin_to_dec(s[1:])) 
+0

我不确定。这工作,但需要数学库。 – gregpaton08 2014-10-10 17:07:56

0

这里有一个较短(按行)基于@PeterPeiGuo的递归版本:

def bin_to_dec(s): 
    return int(s[-1]) + (len(s)>1 and 2*(bin_to_dec(s[:-1])))