马黑黑 发表于 2023-1-28 20:29

打印兔子数列

本帖最后由 马黑黑 于 2023-1-28 21:17 编辑 <br /><br /><style>
.chj_code {
        position: relative;
        margin: 10px 0 10px 60px;
        border-left: 2px solid tan;
        font: normal 16px/20px Consolas, Monaco, monospace;
}
.chj_code > p {
        margin: 3px 0 3px 10px;
        position: relative;
        white-space: pre-wrap;
        tab-size: 4;
}
.chj_code > p::before {
        position: absolute;
        width: 40px;
        left: -55px;
        content: attr(data-line);
        text-align: right;
        color: #ccc;
}
</style>
兔子数列又称裴波那契数列,因为其发明者是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci,1170—1250)。说的是,假如一对兔子第三个月龄就拥有繁殖能力,且此后每个月可以且只生一对小兔崽子(一胎政策严格执行),辣么,假如给你一对成年兔子,请问:往下每一个月你能拥有多少对兔子?<p></p><div><br></div><div><span id="kM0.7062195988500775">@辫子哥哥&nbsp;回答:1,1,<font color="#ff0000">2</font>,3,5,8,13,21,34,55,89,……&amp;*……%</span><br></div><div><span><br></span></div><div>辫子哥哥没能答上来的是省略号后面,一般而言,辫子哥哥都数不出超过100的数,发工资时给它发 99&nbsp;元就可以了,大家要理解。嗯,作为资深杀猪佬,我有义务将省略号后面的答案公布一下:</div><div><br></div><div>&nbsp; &nbsp; (n-2) + (n-1) (n≥2,n∈N*)</div><div><br></div><div>上述公式,说的是:辫子哥哥的线性数列中,从第三项(数列中的<font color="#ff0000">2</font>)开始,每一项均等于前两项之和。这个算法就是兔子数列算法,即每一对新兔子从第三个月开始生一对崽而后兔子对数的变化;其实也是黄金分割的依据,辫子哥哥的亿万个理想之一就是自己250岁的时候能拥有满嘴的金牙。</div><div><br></div><div>好了,废话不多说,我们现在可以用 JS&nbsp;来打印这些数列。</div><div><br></div><div>递归法完成这个事可能最简单,不过,递归运行慢,还容易造成死循环或者因兔子太多运行栈溢出而出错,所以,我们可以用&nbsp;for&nbsp;循环来完成这个工作,简单高效没问题没错误。下面是我编写的代码:</div><div><br></div><div><br></div>
<div class="chj_code">
<p>&lt;<span style="color:darkred">div</span> <span style="color: red">id</span><span style="color: blue">=</span><span style="color: magenta">"mydiv"</span>&gt;&lt;<span style="color: darkred">/div</span>&gt;</p>
<p><br?< p="">
</br?<></p><p>&lt;script&gt;</p>
<p><br?< p="">
</br?<></p><p><span style="color: blue">let</span> total = 50; <span style="color: green">//声明兔子数列第几位</span></p>
<p><span style="color: blue">let</span> febAr = []; <span style="color: green">//声明存储兔子数列的数组</span></p>
<p><span style="color: blue">let</span> febNum; <span style="color: green">//声明兔子数列数</span></p>
<p><br?< p="">
</br?<></p><p><span style="color: blue">for</span>(i = 0; i &lt; total; i++) {</p>
<p>        <span style="color: blue">if</span> (i&gt;=2) {</p>
<p>                febNum = febAr + febAr;</p>
<p>        } <span style="color: blue">else</span> {</p>
<p>                febNum = 1;</p>
<p>        }</p>
<p>        febAr.push(febNum);</p>
<p>}</p>
<p><br?< p="">
</br?<></p><p>mydiv.innerText = febAr.join(<span style="color: magenta">', '</span>);</p>
<p><br?< p="">
</br?<></p><p>&lt;/script&gt;</p>
</div>

<p><br>这里,我们用一个&nbsp;div&nbsp;来装载打印结果,这个容易看得出来。JS中,用一个&nbsp;for&nbsp;循环,将兔子序列数一一压进数组,最后将数组元素打印到&nbsp;div&nbsp;中。效果请看下楼。</p>

<script>
(function setLineNum() {
        let code_papas = document.querySelectorAll('.chj_code');
        Array.from(code_papas).forEach( (item,key) => {
                let pps = item.children;
                Array.from(pps).forEach( (p,pkey) => {
                        p.setAttribute('data-line', pkey + 1);
                });
        });       
})();
</script>

马黑黑 发表于 2023-1-28 20:30

<div id="mydiv"></div>

<script>

let total = 50; //声明兔子数列第几位
let febAr = []; //声明存储兔子数列
let febNum; //声明兔子数列数

for(i = 0; i < total; i++) {
        if (i>=2) {
                febNum = febAr + febAr;
        } else {
                febNum = 1;
        }
        febAr.push(febNum);
}

mydiv.innerText = febAr.join(', ');

</script>

马黑黑 发表于 2023-1-28 20:31

@辫子哥哥

红影 发表于 2023-1-28 22:05

到21词的时候就已经过万了,按这样的数列算下去,小兔子如果一直不死,用不了多久就泛滥成灾了{:4_173:}

红影 发表于 2023-1-28 22:06

febNum = febAr + febAr;
JS里直接就有这个公式啊,厉害了{:4_199:}

马黑黑 发表于 2023-1-28 23:10

红影 发表于 2023-1-28 22:06
febNum = febAr + febAr;
JS里直接就有这个公式啊,厉害了

这公式是自己编写的。JS提供方法,思路自己去完成。

马黑黑 发表于 2023-1-28 23:13

红影 发表于 2023-1-28 22:05
到21词的时候就已经过万了,按这样的数列算下去,小兔子如果一直不死,用不了多久就泛滥成灾了

兔子泛滥成灾的现象还真有。两个典型的例子:

一个在英国。英国草地多,又喜欢小动物,野生兔子一般没人去侵扰。但公路上,兔子被意外碾死的比较多。

另一个在澳洲。本来,澳洲没有兔子,是移民当宠物带过去的,因繁殖太快,弃之,没想到它们在野外更容易生存,一下子成灾。

庶民来了 发表于 2023-1-29 04:40

专业的文字组,我就是羡慕一下。

红影 发表于 2023-1-29 09:38

马黑黑 发表于 2023-1-28 23:10
这公式是自己编写的。JS提供方法,思路自己去完成。

哦,对,JS可以做循环,就不需要列式做手工裴波那契数列计算了。黑黑聪明,JS太适合做这个数列的计算了{:4_199:}
(n-2)和(n-1)其实是下标,把它们看成是数字就偏了。我一个不小心就偏到岔路上去了。

红影 发表于 2023-1-29 09:40

马黑黑 发表于 2023-1-28 23:13
兔子泛滥成灾的现象还真有。两个典型的例子:

一个在英国。英国草地多,又喜欢小动物,野生兔子一般没 ...

还有个例子是德国的螃蟹,因为没有天敌,也成灾了。对喜欢吃螃蟹的国人来说,真是好消息{:4_173:}

马黑黑 发表于 2023-1-29 12:07

红影 发表于 2023-1-29 09:40
还有个例子是德国的螃蟹,因为没有天敌,也成灾了。对喜欢吃螃蟹的国人来说,真是好消息

还有英国的鲤鱼,大得不得了,他们不吃,也不去伤害,但每年会对国外钓友开放一段时间

马黑黑 发表于 2023-1-29 12:08

红影 发表于 2023-1-29 09:38
哦,对,JS可以做循环,就不需要列式做手工裴波那契数列计算了。黑黑聪明,JS太适合做这个数列的计算了{: ...

JS作为语言,循环还是比较成熟的

马黑黑 发表于 2023-1-29 12:08

庶民来了 发表于 2023-1-29 04:40
专业的文字组,我就是羡慕一下。

{:4_190:}

辫子哥哥 发表于 2023-1-29 12:35

马黑黑 发表于 2023-1-28 20:31
@辫子哥哥

来了来了{:4_187:}

辫子哥哥 发表于 2023-1-29 12:36

可惜我是睁眼瞎{:4_203:}

辫子哥哥 发表于 2023-1-29 12:40

其他都可以不理睬,这满嘴的金牙肯定喜欢的,因为金牙在我口中,是自己的东西,当然可以变现了{:4_170:}

马黑黑 发表于 2023-1-29 12:57

辫子哥哥 发表于 2023-1-29 12:40
其他都可以不理睬,这满嘴的金牙肯定喜欢的,因为金牙在我口中,是自己的东西,当然可以变现了

吐出来就变现了{:5_106:}

马黑黑 发表于 2023-1-29 12:57

辫子哥哥 发表于 2023-1-29 12:35
来了来了

{:4_190:}

马黑黑 发表于 2023-1-29 12:57

辫子哥哥 发表于 2023-1-29 12:36
可惜我是睁眼瞎

{:4_180:}

红影 发表于 2023-1-29 22:40

马黑黑 发表于 2023-1-29 12:08
JS作为语言,循环还是比较成熟的

我去搜了一下,用裴波那契数列为边长,做出的弧线特别漂亮,而其这个数列还有很多神奇之处。
页: [1] 2 3 4
查看完整版本: 打印兔子数列