模式和序列 - 将 'a' 表示为 'n' 的函数

Patterns and Sequence - Express 'a' as a function of 'n'

我有以下模式。我想将 'a' 表示为 n.

的函数
if n=0 then a=0
if n=1 then a=0
if n=2 then a=3
if n=3 then a=3
if n=4 then a=10
. 
.
.
if n=10 then a=10
if n=11 then a=29
.
.
. 
if n=29 then a=29
if n=30 then a=66
.
.
.
if n=66 then a=66
if n=67 then a=127
.
.

您可以看到 a 的值保持不变,直到 a 值与 n 匹配。之后 a 的值发生变化,该值再次保持到 a<=n。我找到了出现这种模式的公式。是

a = 1^3 + 2n<=3

a = 2^3 + 2n > 3 and n <=10 等等。

如何将 a 表示为 n 的函数? 喜欢 f(n) = {___ <condition>

您可以应用公式 n^3-2 的倒数,四舍五入,然后再次应用该公式,以获得正确的序列。不过,0、1 和 2 的值必须进行硬编码。

注意:在输入数字的语言中,确保立方根的结果是浮点数;如果自动转换为int,转换时会向下舍入。

function calculate(n) {
    if (n <= 1) return 0;
    if (n == 2) return 3;
    return Math.pow(Math.ceil(Math.pow(n - 2, 1 / 3)), 3) + 2;
}

for (var i = 0; i < 70; i++) {
    document.write(i + "&rarr;" + calculate(i) + " ; ");
}    

附录:正如 Stefan Mondelaers 评论的那样,在依赖浮点数学时必须小心。上面的代码利用了三次方的立方根在 JavaScript 中总是被略微低估的事实(至少在我测试过的所有当前浏览器中);例如JavaScript 的安全整数范围内最大的三次方是 4,503,569,204,744,000 但你将得到的不是它的立方根 165,140:

document.write(Math.pow(4503569204744000, 1/3));

如果您要对浮点计算的结果进行四舍五入,这些非常小的错误可能会导致更大的错误。最简单的解决方法确实是在四舍五入之前添加或减去一个非常小的值。有关更多信息,请参见例如this question.