使用递归在Python中将整数转换为x进制系统

1 投票
5 回答
14380 浏览
提问于 2025-04-15 18:10

我正在尝试写一个递归的代码,可以把一个数字转换成任意进制的系统。比如,把整数10转换成二进制,就是变成1010。

到目前为止,我写的代码有点问题,输出结果中间出现了“None”。有没有人能帮我看看我的代码?

def convert(a,b):
    add = a%b
    if a<=1:
        return a
    else:
        print(base(a//b,b), add)

我的想法是,a%b是要加到数字末尾的部分,而a//b是递归的部分,它使用之前得到的二进制数字的结果。所以10在二进制下就是convert(5,2),然后在末尾加上0,因为a//b=5,a%b=0,这样就得到了1010。

5 个回答

0

convert 函数返回的是 None,而 print 会把这个 None 打印出来。你要么把 print 这一行去掉,要么把结果累积成一个字符串然后返回。

(我假设你调用 base 实际上是想递归地调用 convert。)

1

我建议你把代码结构整理得更清晰一些。你可以把你提到的模糊任务拆分成几个小任务,比如:

  • 确定并规范数字和基数的符号(你需要支持负基数吗,还是可以直接抛出异常?),同时确保在出错的情况下立即抛出异常(例如,基数为01时);
  • 写一个函数,给定正值和正确的ab,返回一个“数字序列”,用来表示a在基数b下的表示,其中“数字”是一个介于0(包括)和b(不包括)之间的整数;
  • 写一个函数,给定a的符号和数字序列,构建并返回一个字符串表示——这取决于你想如何表示非常大的“数字”,当基数很大,比如大于36时,如果你想用数字表示,前36个数字可以用明显的方式表示为ASCII字母;也许你应该接受一个“字母表”字符串来实现这个目的(而上面的第一个函数应该在基数对给定字母表来说太大时抛出异常);
  • 写一个函数,利用以上所有函数来打印出字符串。

在这些任务中,只有第二个任务可以被视为适合“递归”实现的,如果有人坚持这样做(不过其实迭代实现会更自然!)——鉴于这是作业,我想你可能需要用递归来完成,因为这是作业要求的一部分,唉!-)。不过,作为参考,一种明显的迭代方式是:

  def digitsequence(a, b):
    results = []
    while True:
      results.append(a % b)
      if a < b: break
      a //= b
    return reversed(results)

假设我们想要的数字序列是我们习惯的“高位优先”顺序,这种顺序来自于位置十进制表示法进入西方文化的方式(在阿拉伯原文中其实是更自然计算的低位优先顺序……但由于阿拉伯语是从右到左书写的,这种顺序在欧洲语言中被字面转录为从左到右,因此变成了高位优先!-)。

无论如何,你可以把简单的线性递归看作一种隐式“反转”方式(你可以说这种递归“隐藏”了一个后进先出栈,这显然是一种反转序列的方式;-),我想这就是作业要求中提到递归的原因;-)。

1

你的 else 代码块里没有返回语句,而且你也没有调用 convert 这个函数。

我觉得你可能想要的是:

if a<=1:
    return str(a)
else:
    return str(convert(a//b,b)) + str(add)

就像这样

>>> def convert(a,b):
...   add = a%b
...   if a<=1:
...     return str(a)
...   else:
...     return str(convert(a//b,b)) + str(add)
... 
>>> convert(10,2)
'1010'

一般来说,在递归函数中尽量避免混合不同类型的数据。通常情况下,你的基本情况和递归情况应该返回相同类型的数据。

撰写回答