如何在Mathemathica中定义使用复杂递归关系的函数?

时间:2020-02-12 20:58:49

标签: math wolfram-mathematica discrete-mathematics mathematica-8

我正在尝试编写一个小脚本来计算整数序列。我想用代码编写的函数是一个在黑板上的函数a(n)。问题是我期望我在脚本中定义的函数h(n)给出一个数字结果,但是它给出了其他内容:对于h(2),它给出了ArgMax[{p, HarmonicNumber[p] <= 1}, p, Integers]我该如何纠正? (您必须了解我绝不是程序员,也不是对mathematica的了解。在此感谢您。 我写的脚本就是这样的:

    h[n_] := (ArgMax[{p, 
      Sum[1/s, {s, 1 + Sum[h[k], {k, 1, (n - 1)}], p}] <= 1}, p, 
     Integers]) - Sum[h[k], {k, 1, (n - 1)}]; h[1] = 1;

Image of the definition written by hand a(n)=(maximum p such that the sum from s equals r to p is less or equal than one)-r+1, where r=1+the sum from k=1 to (n-1) of a(k), and a(1)=1

PD:看起来像v的字母是r的字母。抱歉。

2 个答案:

答案 0 :(得分:1)

收到此答案的主要原因是Mathematica中的Sum命令进行了复杂的符号计算,以将术语和表达式重写为经典的数学函数,从而尝试对所有事物进行尽可能少的假设。

当然,如果您将整数的倒数相加,它会尝试返回到谐波数。

它通常很有用,但可能有多种用途。

为避免这种情况,只需替换

Sum[ , {var, start, end}]

作者

Total[Table[ , {var, start, end}]]

它应该可以为您提供所需的信息,而无需花费时间来进行求和符号解释。

无论如何,您的代码中存在重大麻烦。

  • 您应该为h使用备忘录

  • 您想要找到最大的p,以使从r开始的逆总和小于或等于1。您的代码将不这样做。您不能简单地将不等式放入范围参数。您必须使用控制来循环求和或使用反函数。

答案 1 :(得分:1)

a[1] = 1;

a[n_] := Module[{sum = 0},
  r = 1 + Sum[a[k], {k, n - 1}];
  x = r;
  While[sum <= 1, sum += 1/x++];
  p = x - 2;
  p - r + 1]

Table[a[n], {n, 6}]

{1、2、6、16、43、117}

a[4]的结果为16而不是14。

举例说明,当n = 4

r = 1 + Sum[a[k], {k, 4 - 1}]

  = 1 + a[1] + a[2] + a[3]       (* refer to established results for a[n] *)

  = 1 +  1  +  2  +  6  =  10

sum = 0;
x = r;
While[sum <= 1, sum += 1/x++];
p = x - 2;
p - r + 1

16

或以其他形式

Total[Table[1/s, {s, 10, 25}]] <= 1   (* True *)

p - r + 1 = 25 - 10 + 1 = 16

使用memoisation,如ogerard所述

Clear[a]

a[1] = 1;

a[n_] := a[n] = Module[{sum = 0},
   r = 1 + Sum[a[k], {k, n - 1}];
   x = r;
   While[sum <= 1, sum += 1/x++];
   p = x - 2;
   p - r + 1]

仅将以下运行时间减少9秒

Timing[Table[a[n], {n, 14}]]

{40.8906,{1,2,6,16,43,117,318,865,2351,6391,17372,47222, 128363,348927}}

相关问题