在与Hofstadter序列有关的大学任务中存在这个问题。它基本上说它是一个整数序列等等,并且给定索引n有两个值。男性值[M(n)]和女性值[F(n)]。
它们被定义为:
我们被要求在python中编写一个程序来查找给定整数序列的Male和Female值。
所以我写的代码是:
def female(num):
if num == 0:
return 1
elif num >0:
return num - male(female(num-1))
def male(num):
if num==0:
return 0
elif num >0:
return num - female(male(num-1))
用类似命令执行时
print male(5)
它没有大惊小怪。但是当我试图找到n = 300的值时,程序没有输出。
所以我在其中一个函数中添加了一个print方法来找出num值
[elif num>0:
print num ...
]
并且它表明num值正在减少到1并且有时会在1到2之间跳跃,达到6之类的值。
我无法弄清楚它为什么会发生。任何见解都会很好。另外,我该怎么做才能找到与更大整数相关的值。提前致谢。干杯。
答案 0 :(得分:3)
代码在理论上很好。你低估的是计算的复杂性。式
M(n)=n-F(M(n-1))
实际上意味着
tmp = M(n-1)
M(n) = n - F(tmp)
因此,如果您将此计算表示为必要调用树,您可能会看到它是一个二叉树,您应该遍历其所有节点以计算结果。鉴于M(n)
和F(n)
约为n/2
,我估计订单2^(n/2)
的节点总数一旦放入{{1}就成为一个巨大的数字}} 那里。所以代码可以工作,但这需要很长时间才能完成。
解决这个问题的一种方法是以memoization的形式使用缓存。像这样的代码:
n = 300
应该能够立即计算femCache = dict()
def female(num):
#print("female " + str(num))
global femCache
if num in femCache:
return femCache[num];
else:
res = 1 # value for num = 0
if num > 0:
res = num - male(female(num-1))
femCache[num] = res
return res
maleCache = dict()
def male(num):
#print("male " + str(num))
global maleCache
if num in maleCache:
return maleCache[num];
else:
res = 0 # value for num = 0
if num > 0:
res = num - female(male(num-1))
maleCache[num] = res
return res
print(male(300))
。