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

时间:2018-09-04 20:58:57

标签: algorithm function math sequence analysis

我有以下模式。我想将“ 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>

1 个答案:

答案 0 :(得分:3)

您可以应用公式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