Google foobar编程挑战中出现了奇怪的RuntimeError

3
这是我的第二个挑战 - 它叫做“guard_game”。
挑战是创建一个函数,递归地将数字的各个位数相加,直到只剩下一位数字,并返回该数字。
以下是我的解决方案,在我的机器上运行得很好:
answers = {}

def answer(x):
     return answers[x] if answers.setdefault(x,sum(int(_) for _ in str(x))) in xrange(1,10) else answer(answers[x])

if __name__ == '__main__':
    print answer(1235)
    print answer(13)

然而,Google foobar控制台在第4行抛出了一个“RuntimeError”。我已经尝试将逻辑拆分成单独的块(在不能像控制台屏幕一样print的情况下很难做到),并且似乎是由这个代码引起的:str(x)
可能相关的是:Google foobar限制条件中提到的代码在Python 2.7.6沙盒内运行。我学习时使用了100%的Python 3,所以有一定机会我做错了什么。约束还说输入将是1到2147483647之间的“long”(在现代Python中与“int”相同)。
有人知道问题可能是什么吗?

在人们开始讨论其他方法之前:是的,我知道x%9的技巧。这个问题不是关于如何完成挑战,而是关于RuntimeError的原因。 - Rick
请发布完整的Traceback。我无法复制问题;你的解决方案对我有效。 - wwii
@wwii 没有回溯。错误只发生在Google foobar虚拟控制台中,它不提供回溯。 - Rick
好的,在标准的32位Windows安装上它并没有“崩溃”,所以可能是虚拟控制台出了问题。 - wwii
@wwii 这就是我的想法。我向谷歌提交了有关此问题的错误反馈。可能永远不会收到任何回复。 - Rick
显示剩余2条评论
1个回答

3

我注意到一件事情(这在另一个名为String Cleaning的挑战中也发生了),在Google Foobar中,过多的递归调用并不奏效。它会花费太长时间,然后什么结果都没有返回。我优化了我的代码,并减少了很多递归调用,这样就能正常运行了。


3
在我对 Foobar 的进阶中,我认为由于他们想要测试程序的效率和优化,所以不鼓励使用执行时间过长的函数。在进行第四级挑战时,我使用了记忆缓存方法来保存函数调用结果,用于递归调用时节省时间。这确实有所改善。 - Lance Ruo Zhang
1
谢谢你的建议! - Rick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接