我正在尝试记住除数的数字。
divisorSums = {}
def sumDivisors(num):
global divisorSums
total = 0
if num == 1:
return 0
for i in xrange(num/2, 0, -1):
if i in divisorSums:
return divisorSums[i]
else:
if not num % i:
total += i
divisorSums[num] = total
return total
然而,当我遍历数字时,这会为所有数字返回1。当它单独使用时是正确的,所以问题是我的查找系统。我很确定我不明白如何在字典中查找值。有人可以帮助我吗?
答案 0 :(得分:3)
memoize的常用快捷方法是使用可变的默认参数
def sumDivisors(num, divisorSums={}):
if num in divisorSums: # Check if you have
return divisorSums[num] # memoized the answer here
total = 0
if num == 1:
return 0
for i in xrange(num/2, 0, -1):
if not num % i:
total += i
divisorSums[num] = total
return total
除此之外,您的代码似乎正常工作。你是如何运行它来获得1
的?
答案 1 :(得分:2)
下面:
if i in divisorSums:
return divisorSums[i]
返回divisorSums [i]不是正确的做法,因为可能有一些素数因子小于i
。以下是使用辅助函数记忆/计算数字因子的一种方法:
from itertools import groupby
divisorC={}
def divisors(num):
if num in divisorC:
return divisorC[num]
l = {1:1}
for i in xrange(num/2, 1, -1):
if num % i == 0:
l[i] = 1
l.update(divisors(i))
l.update(divisors(num/i))
break
divisorC[num] = l
return divisorC[num]
def sumDivisors(num):
if num == 1: return 0
l = {}
for i in xrange(num/2, 0, -1):
if num % i == 0:
l.update(divisors(i))
l.update(divisors(num/i))
l[i] = 1
l[num/i] = 1
break
return sum(v for v in l)