【问题标题】:TypeError in Recursive Function (Decimal to Binary)递归函数中的 TypeError(十进制到二进制)
【发布时间】:2018-10-28 13:46:15
【问题描述】:

所有,我有这段代码,在我的一生中,我无法弄清楚如何解决这个 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 没有提供任何我可以尝试的解决方案适用于我的问题)我还能做什么。任何想法都会有所帮助!

【问题讨论】:

  • “我需要它作为字符串返回”为什么?
  • 类型错误是因为你在dtobr的结果上调用dtobr,它乘以一个int。

标签: python recursion


【解决方案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 可以。

【讨论】:

    【解决方案2】:

    你可以这样做:

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

    【讨论】:

      【解决方案3】:

      目前提供的两种解决方案都涉及到strint 的转换,然后再返回。我不认为这是必要的,我们可以在没有 int() 和乘法的情况下解决这个问题:

      def dtobr(n):
          if n == 0:
              return '0'
      
          return dtobr(n // 2).lstrip('0') + str(n % 2)
      

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

      示例

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        相关资源
        最近更新 更多