做了一个recursion程序,将列的位置转换为Excel列(1 = A,27 = AA),在我的输出中获得@

我让这个程序熟悉了recursion以及它正在工作的所有意图和目的。

def alpha_covert(to_print): if to_print is 0: return 'Z' else: return chr(int(to_print) + 64) def order(to_print): if to_print <= 26: return alpha_covert(to_print) else: return (str(order(to_print % 26))) + (str(order(to_print / 26))) 

一些示例输出:

 >>print(order(1)) >>print(order(100)) >>print(order(443)) >>print(order(9001)) >>print(order(9999999999999999)) A VC AQ EHM O@JIHYHMTURB 

对于最后的输出为什么有一个@ ? 我认为没有问题,因为int没有被声明,直到我使用alpha_covert ,那么应该只是less than or equal to 26

这是一种浮动舍入错误?


一些额外的样本,而我试图自我解决这个问题。 我不知道这是什么意思:

 >>print(order(9999999999999997)) >>print(order(9999999999999998)) >>print(order(9999999999999999)) M@JIHYHMTURB N@JIHYHMTURB O@JIHYHMTURB 

这里的问题是:

 if to_print is 0: 

发生在将to_print转换为整数之前 。 此外,你应该真正使用平等( == )不是身份( is ); 小整数是在CPython中实现的,但是这是一个你不应该依赖的实现细节。

最简单的解决方法是:

 if to_print == '0': # compare to string, and by equality 

但更好的方法是先将数字转换成数字,然后使用零数值评估false-y的事实:

 def alpha_convert(to_print): # note typo in function name """A docstring would be nice, too!""" to_print = int(to_print) return chr(to_print + 64) if to_print else 'Z'