我是Python的新手,所以如果这是一个简单的修复,我会道歉。我一直坚持Codeval问题(Happy Numbers)很长一段时间,我不确定会出现什么问题。
问题描述:
从任何正整数开始,将数字替换为其数字的平方和,并重复该过程直到数字等于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 (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")
我已尝试过:
根据我从其他类似问题中收集的内容,问题可能是当我点击str
行时,我无法将int
转换为i = int(i)
。我的理解是,在对其进行任何数学运算之前,我必须将str
类型转换为int
类型,但看起来它就是失败的地方。
我自己测试了happy_or_not
函数,它确实打印出了我期望它的值。对我来说,当我尝试在happy_or_not
函数内调用happy_number_check
函数时,问题就出现了,该函数正在读取我的txt文件(包含要测试的数字列表)。我不能在这里抓住一个更大的原则,所以任何解释都会有所帮助。
这也是我对递归函数的第一次真正尝试,并且可能有更好的方法来构建它,所以非常欢迎任何关于如何改变事物的建议。
提前谢谢!
答案 0 :(得分:1)
尝试像这样更改happy_number_check
(验证每一行是一个整数):
def happy_number_check(file):
with open(file, 'r+') as f: # Safer way to open a file. Will automatically close for you even if something goes wrong
for line in f:
if line.strip().isdigit():
happy_or_not(line.strip())
strip()
也会使您删除此代码:
if i == " ":
continue
else:
顺便说一句,你的逻辑中也有一个错误。您依赖于RuntimeError - 一个有趣的Stack Overflow :-) - 终止测试。你应该真正跟踪已经尝试过的数字,如果再次尝试相同的数字,则返回0。
如果您不想直接解决问题,请不要点击此链接,但如果您这样做,则这是一个迭代解决方案:http://rosettacode.org/wiki/Happy_numbers#Python