Hofstadter方程相关代码在python中

时间:2018-05-15 16:29:54

标签: python math sequences

在与Hofstadter序列有关的大学任务中存在这个问题。它基本上说它是一个整数序列等等,并且给定索引n有两个值。男性值[M(n)]和女性值[F(n)]。

它们被定义为:

  • M(0)= 0
  • F(0)= 1
  • M(N)= N-F(M(N-1))
  • F(N)= N-M(F(N-1))

我们被要求在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之类的值。

我无法弄清楚它为什么会发生。任何见解都会很好。另外,我该怎么做才能找到与更大整数相关的值。提前致谢。干杯。

1 个答案:

答案 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))