使用递归在Python中将整数转换为x进制系统
我正在尝试写一个递归的代码,可以把一个数字转换成任意进制的系统。比如,把整数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 个回答
convert
函数返回的是 None,而 print
会把这个 None 打印出来。你要么把 print
这一行去掉,要么把结果累积成一个字符串然后返回。
(我假设你调用 base
实际上是想递归地调用 convert
。)
我建议你把代码结构整理得更清晰一些。你可以把你提到的模糊任务拆分成几个小任务,比如:
- 确定并规范数字和基数的符号(你需要支持负基数吗,还是可以直接抛出异常?),同时确保在出错的情况下立即抛出异常(例如,基数为
0
或1
时); - 写一个函数,给定正值和正确的
a
和b
,返回一个“数字序列”,用来表示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)
假设我们想要的数字序列是我们习惯的“高位优先”顺序,这种顺序来自于位置十进制表示法进入西方文化的方式(在阿拉伯原文中其实是更自然计算的低位优先顺序……但由于阿拉伯语是从右到左书写的,这种顺序在欧洲语言中被字面转录为从左到右,因此变成了高位优先!-)。
无论如何,你可以把简单的线性递归看作一种隐式“反转”方式(你可以说这种递归“隐藏”了一个后进先出栈,这显然是一种反转序列的方式;-),我想这就是作业要求中提到递归的原因;-)。
你的 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'
一般来说,在递归函数中尽量避免混合不同类型的数据。通常情况下,你的基本情况和递归情况应该返回相同类型的数据。