【问题标题】:Is there another way to find item n in this recursive sequence?还有另一种方法可以在这个递归序列中找到第 n 项吗?
【发布时间】:2020-03-16 03:11:35
【问题描述】:

顺序是:

an = an-1 + (2 * an-2)

a0 = 1, a1= 1. 求 a100

我的做法是列一个清单。

 #List 'a' with a0 = 1 , a1 = 1.
a = [1,1]
#To get the a100, implement 'i' as the index value of the list.
for i in range (2,101):
  x = a[i-1] + (2 * a[i-2])
  print( str(len(a)) + (": ") + str(x))
  #Save new value to list
  a.append(x)

是否有另一种方法可以直接获取 a100 的值?或者一个10000的值..会占用这么多内存。

【问题讨论】:

  • 您实际上不需要将所有内容存储在列表中:只需将最后两个条目保留在变量中即可。您的更新步骤类似于a0, a1 = a1, a0+2*a1,然后打印a1。我不知道直接计算值的数学技术,但有一个名为“整数序列在线百科全书”(oeis.org)的网站很可能已经知道这个序列,并且可能列出了一个生成函数。只需计算十几个字词,然后将它们粘贴到网站的搜索字段中。
  • 谢谢,这是一个很酷的网站!
  • 我试过你的步骤,效果很好。谢谢! def x(n): a = 1 b = 1 for i in range(2,n): a, b = b, b + 2*a return b print (x(101))

标签: python math sequence


【解决方案1】:

对于这种特定情况,该序列似乎被称为Jacobsthal sequence。 Wikipedia 给出了a_n 的封闭式表达式,可以表示如下:

def J(n):
  return (2**(n+1) - (1 if n % 2 else -1))//3

更一般地说,您可以使用快速矩阵求幂在O(log n) 矩阵运算中找到a_n 的特定值。这里的做法是对this稍作修改。

import numpy as np

def a(n):
  mat = np.array([[1, 2], [1, 0]], dtype=object)  # object for large integers
  return np.linalg.matrix_power(mat, n)[0,0]

这是a_1000 的值:

7143390714575115472989500327066678737076032078036890716291669255802340340832907483287989192104639054183964486117020978834580968571282093623989718383132383202623045183216153990280716403374914094585302788102030983322387960844932511706110362630718041943047464318457694778440286554435082924558137112046251

【讨论】:

  • 非常感谢!现在我知道为什么离散数学与编程中的函数如此密切相关。
【解决方案2】:

这个递归关系有一个闭式解:

a = lambda n: (2**(n+1) + (-1)**n)//3

然后

a(0) == 1
a(1) == 1
a(2) == 3
...

使用 Wolfram Alpha 求解封闭形式 solution

【讨论】:

【解决方案3】:

对于更通用的解决方案,sympy'srsolve 可以生成线性递归公式。然后使用substitution 查找特定值。

from sympy import rsolve, Function, symbols

f = Function('f')
n = symbols('n', integer=True)
T = f(n) - f(n - 1) - 2 * f(n - 2)
sol = rsolve(T, f(n), {f(0): 1, f(1): 1})
print(sol.factor())
for k in range(6):
    print(f'a[{10**k}] = {sol.subs({n:10**k})}')

这会找到公式:((-1)**n + 2*2**n)/3 并替换各种值得到:

a[1] = 1
a[10] = 683
a[100] = 845100400152152934331135470251
a[1000] = 7143390714575115472989500327066678737076032078036890716291669255802340340832907483287989192104639054183964486117020978834580968571282093623989718383132383202623045183216153990280716403374914094585302788102030983322387960844932511706110362630718041943047464318457694778440286554435082924558137112046251
a[10000] = 13300420779205055899224947751223900558823312212574616365680059665686292553481297754613307789357463065266220752948806082847704327566275854078395857288064215971903820031195863017843497700844039930347033391278795541028339072307078736457006049910726416592060326596558672835961088838567081045539649268371274925376816731095916294031173247751323635481912358774462877183753093841891253840488152356727760984122637587639312975932940560640357511880709747618222262691017043766353735428453489979600223956211100972865182186443850404115054687605329465453071585497122508186691535256991501267222976387636433705286400943222614410489725426171396919846079518533884638490449629415374679171890883668485549192847140249201910928687618755494267749463781127049374279769561549759200832570764870138287994839741197500087328573494472227205070621546774178994858997503894208562707691159300991409504210074059830342802209213468621093971730976504006937230561044048029975244677676707947087336124281517272447267049737611904634607637370045500833604005013228174598706158078702963192048604263495032226147988471602982108251173897742022519137359868942131422329103081800375446624970338827853981873988860876269047918349845673238184625284288814399599917924440538912558558685095521850114849105048496522741529593155873907738282168861316542080131736118854643798317265443020838956090639908522753418790270855651099392460347365053921743882641323846748271362887055383912692879736402269982104388805781403942200602501882277026496929598476838303527006808207298214407168983217160516849324232198998893837958637097759081249712999519344381402467576288757211476207860932148655897231556293513976121900670048618498909700385756334067235325208259649285799693889564105871362639412657210097186118095746465818754306322522134720983321447905340926047485500603884544957480384983947611769143791817076603055269994974019086721023722205420067991783904156229025970272783748933896591684108429045765889012975813584862160062970831282169566933785351515891836917604484599090827358327607311145704700506065400164526586785514617302254188281302685535172938965970009784445593131997924161090875584262602248970534271757827918474036922817159666073457645479797721100990086996148246631809842046103645478455250800241851505149187576887740797874187195112987924800865762440512367759907023068198581038345298256830912964615391929510632144672034080214910330858779357159414245558929061170945822567007313514409276959727327732103102944890874437957354081499958646666151187821572015407908429716866090505450005466559490856410166587392640154829574782514412057571343645656039081553195235917082324370960357975081345975714019208241045008362225535513352731779100379038105003677818345932796086474225126766610787543447696005152433715459704967280220123536564742545543604882702212692308056024281175802607700426526000495235781464187268985316355546978912530579053491968145752746720495213034211965438416298865678974339803258684849814383125421063166939821410053665460303868944551299858094210708807124261007787849536528397806251

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2012-10-01
    • 1970-01-01
    • 2021-10-25
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多