--- id: 59637c4d89f6786115efd814 title: Hofstadter Q序列 challengeType: 5 videoUrl: '' dashedName: hofstadter-q-sequence --- # --description--
Hofstadter Q序列定义为:
$ Q(1)= Q(2)= 1,\\ Q(n)= Q \ big(nQ(n-1)\ big)+ Q \ big(nQ(n-2)),\ quad n> 2. $
它定义为Fibonacci序列 ,但Fibonacci序列中的下一个术语是前两个术语的总和,在Q序列中,前两个术语告诉您在Q序列中返回多远以找到两个数字总结以制作序列的下一个术语。
任务:将Hofstadter Q Sequence方程实现为JavaScript # --hints-- `hofstadterQ`是一个函数。 ```js assert(typeof hofstadterQ === 'function'); ``` `hofstadterQ()`应该返回`integer` ```js assert(Number.isInteger(hofstadterQ(1000))); ``` `hofstadterQ(1000)`应该返回`502` ```js assert.equal(hofstadterQ(testCase[0]), res[0]); ``` `hofstadterQ(1500)`应该返回`755` ```js assert.equal(hofstadterQ(testCase[1]), res[1]); ``` `hofstadterQ(2000)`应该返回`1005` ```js assert.equal(hofstadterQ(testCase[2]), res[2]); ``` `hofstadterQ(2500)`应该返回`1261` ```js assert.equal(hofstadterQ(testCase[3]), res[3]); ``` # --seed-- ## --after-user-code-- ```js const testCase = [1000, 1500, 2000, 2500]; const res = [502, 755, 1005, 1261]; ``` ## --seed-contents-- ```js function hofstadterQ(n) { return n; } ``` # --solutions-- ```js function hofstadterQ (n) { const memo = [1, 1, 1]; const Q = function (i) { let result = memo[i]; if (typeof result !== 'number') { result = Q(i - Q(i - 1)) + Q(i - Q(i - 2)); memo[i] = result; } return result; }; return Q(n); } ```