递归函数中的TypeError(十进制到二进制)

时间:2018-10-28 05:05:44

标签: python recursion

所有,我有这段代码,对于我一生来说,我不知道如何解决此TypeError。

def dtobr(n):
    if n == 0:
        return 0
    else:
        return (n % 2) + 10 * dtobr(int(n / 2))

我需要它以字符串形式返回(类的项目要求)。数学是正确的,但是当我将最后一行更改为

return str((n % 2) + 10 * dtobr(int(n / 2)))

我明白了

  

“ TypeError:+不支持的操作数类型:'int'和'str'”。

我尝试将"return (n % 2) + 10 * dtobr(int(n / 2))"设置为x,将y设置为int(x)并返回y,但我一无所知(而Google没有提供我可以尝试解决的任何解决方案)我还能做些什么。任何想法都会有所帮助!

3 个答案:

答案 0 :(得分:1)

对返回值执行str()意味着所有递归调用也将返回一个str,因此您需要将这些返回值转换回一个int,例如:

def dtobr(n):
    if n == 0:
        return '0'
    else:
        return str((n % 2) + 10 * int(dtobr(n // 2)))

In []:
dtobr(10)

Out[]:
'1010'

或者仅使用辅助函数进行转换:

def dtobr(n):
    return str(dtobr_(n))

def dtobr_(n):
    if n == 0:
        return 0
    else:
        return (n % 2) + 10 * dtobr_(n // 2)

In []:
dtobr(10)

Out[]:
'1010'

但是我不明白为什么仅呼叫str(dtobr(10))会带来同样的后果。

请注意://是整数除法,因此您不需要int(n/2)n//2会做到。

答案 1 :(得分:0)

您可以执行以下操作:

def dtobr(n):
   n = int(n)
   if n == 0:
      return 0
   else:
      return str((n % 2) + 10 * int(dtobr(int(n / 2))))

答案 2 :(得分:0)

到目前为止,提供的两种解决方案都涉及到strint的转换,然后再转换回来。我认为这不是必需的,我们可以不用int()和乘法来解决这个问题:

def dtobr(n):
    if n == 0:
        return '0'

    return dtobr(n // 2).lstrip('0') + str(n % 2)

诀窍是在当前数字之前进行递归,而不是相反。这样可以避免转换回int和乘以10。

示例

>>> dtobr(12)
'1100'
>>>