## 假定我们已经限制了n只能会是奇数
def sum_odd_factorials(n, d):
# 如果n已经算过了,直接返回算好的答案
if n in d:
return d[n]
if n == 1:
return 1
elif n == 3:
return 7
# 前面的和,如果n是5,那前面的和就是 1! + 3!
prev_sum = sum_odd_factorials(n-2, d)
# 构建答案,前面的和 + (前面的和 - 再前面的和)*(n-1)*n
# 例如n = 5, ret = (1!+3!) + (3!)*4*5
ret = prev_sum + (prev_sum - sum_odd_factorials(n-4, d)) * (n-1) * n
# 保存n对应的答案
d[n] = ret
return ret
# 用字典来保存算过的n,避免重复运算,牺牲内存换速度的意思
d = {}
sum_odd_factorials(11, d)
我提供的不是什么很高级的算法, 只是单纯用迭代来完成,也许楼上的答案已经够好了(起码容易懂),这只是另一种思路。
有意学算法的话可以分析一下。