【发布时间】:2015-11-05 17:26:09
【问题描述】:
我是 Python 新手,所以如果这是一个简单的解决方法,我深表歉意。我在 Codeval 问题(Happy Numbers)上卡住了很长一段时间,我不确定出了什么问题。
问题描述:
从任何正整数开始,将数字替换为其数字的平方和,然后重复该过程直到数字等于 1,或者在不包括 1 的循环中无限循环。以 1 结尾的过程是快乐的,而不以 1 结尾的过程是不快乐的。
例如:
7 是一个快乐的数字 (7->49->97->130->10->1)
22 不是一个快乐的数字 (22->8->64->52->29->85->89->145->42->20->4->16->37->58 ->89 ...)
我的测试输入和预期结果:
1 --> 1
7 --> 1
22 --> 0
如果是开心数,打印1,如果不是,打印0。
这是完整的 Traceback:
Traceback (most recent call last):
File "/happy_number.py", line 58, in <module>
happy_number_check("happy_numbers.txt")
File "/happy_number.py", line 55, in happy_number_check
happy_or_not(line)
File "/happy_number.py", line 33, in happy_or_not
i = int(i)
ValueError: invalid literal for int() with base 10: ''
这是我的代码:
# test = 7
def happy_or_not(number):
number = str(number)
if number == 1:
print 1
else:
new_num = 0
for i in number:
i = int(i)
if i == " ":
continue
else:
new_num += i**2
if new_num == 10 or new_num == 10:
print 1
else:
try:
happy_or_not(new_num)
except RuntimeError:
print 0
# happy_or_not(test)
def happy_number_check(file):
f = open(file, 'r+')
for line in f:
if line == "":
continue
else:
happy_or_not(line)
happy_number_check("happy_numbers.txt")
我已经尝试过的:
根据我从其他类似问题中收集的信息,问题可能是当我点击i = int(i) 时,我无法将str 转换为int。我的理解是,在对其进行任何数学运算之前,我必须将 str 类型转换为 int 类型,但看起来这就是它失败的地方。
我自己测试了happy_or_not 函数,它确实打印出了我期望的值。在我看来,当我尝试在 happy_number_check 函数内调用 happy_or_not 函数时,问题就出现了,该函数正在读取我的 txt 文件(包含要测试的数字列表)。我不能在这里掌握更大的原则,因此任何解释都会有所帮助。
这也是我对递归函数的第一次真正尝试,可能有更好的方法来构建它,因此欢迎任何关于如何将其更改为更有效的建议。
提前谢谢你!
【问题讨论】:
-
您正在尝试将空字符串转换为 int,所以它失败了。尝试调试并找出为什么你得到一个空字符串。
-
正如错误所说,您正在向
int()发送一个空字符串。不要给它一个空字符串。 -
你说
i = int(i)然后检查i == " "是否永远不会发生;整数不能是带有单个空格的字符串。 -
你也说
number = str(number),然后检查number == 1,这又是不可能发生的。 -
Protip:当你需要一个新的变量时,使用一个新的名字。示例:使用
str_number=str(number)代替number=str(number)。 Python 解释器两者都接受,但你可怜的碳基大脑使用第二个比第一个好得多。
标签: python string recursion error-handling int