我正试图解决这个问题:
给定正整数n,返回严格增加 数字的序列(列表/数组/字符串取决于语言),所以 方块的总和等于n²。
如果有多个解决方案(并且会有),请返回结果 具有最大可能值:
基本上,平方数被解构为较小的正方形。但是,我的代码只能有效地处理小数字(20表示第一段代码的最大值,30秒表示第二段),并且指数慢一些。我该如何开发代码?
我对语言的效率知之甚少,并且能够应用到我的代码中,我尝试通过设置梳子来减少内存使用量来优化它,以便为下面的那些取出任何不相关的数据
对于第二段代码,我尝试使用递归来解决我的问题,但它仍然以指数速度变慢。也许我需要一种新方法?非常感谢。
import itertools as it
from math import sqrt
def decompose(n):
squares = [i ** 2 for i in range(1, n) if (i ** 2)/2 < n ** 2]
comb = [list(i) for i in (reduce(lambda acc, x: acc + list(it.combinations(squares, x)),
range(1, len(squares) + 1), [])) if sum(i) == n ** 2]
print [int(sqrt(i)) for i in max(comb)]
decompose(20)
这是第一次尝试,效率低下,所以我试过了。
from math import sqrt
stuff = []
def decompose(a):
def subset_sum(numbers, target, partial=[]):
s = sum(partial)
if s == target:
stuff.append(partial)
if s >= target:
return
for i in range(len(numbers)):
n = numbers[i]
remaining = numbers[i+1:]
subset_sum(remaining, target, partial + [n])
compare = 1
large = None
subset_sum([x**2 for x in range(1, a)], a**2)
for y in stuff:
if compare < y[-1]:
compare = y[-1]
large = y
print [int(sqrt(o)) for o in large]
decompose(30)