斐波那契数列

斐波那契数列又称“兔子数列”,因为这个数列可以用一个有关兔子的问题来描述:一对兔子在出生两个月后,每个月都可以生出一对小兔子,如果兔子能够长命百岁,那么1对兔子在第个月,会变成多少对兔子呢?

 第1、2个月,兔子都是1对,第3个月,第1对小兔子出生了,共2对……第n个月,比前一个月多出的小兔子总数就是两个月前(第n-2个月)的兔子总数。这样,兔子总数就构成了这样的一个数列:1,1,2,3,5,8,13…从第三项起,每一项都是前两项之和。

 这个问题是一个循环计算问题,从前两项的1,1起,循环计算最后两项的和来作为新项的值就可以。在esProc中,可以通过下面的方法循环计算:

 ABC
120  
2/ for n Loop  
3=[1,1]  
4for A1-2=A3.m(-1)+A3.m(-2)>A3=A3|B4

这个方法是用for n循环来循环执行指定次数,由于在初始设定中已经设定了第一项和第二项的值,因此循环计算的次数也要减2。A3中存储斐波那契数列,B4中计算数列的最后两项之和,C4中的语句把B4中的结果添加到数列中。流程图如下:

计算完成后,A3中的结果为:

在esProc中,还可以选用for x循环,当x的值为true时一直循环执行语句块,如下图所示:

5/while Loop  
6=[1,1]  
7for A6.len()<A1>A6=A6|A6.m(-1)+A6.m(-2) 

A6中存储斐波那契数列,根据A7中的语句,当项数小于指定总数时循环执行,B7中的语句相当于合并了B4和C4中的语句,直接计算出新项添加入数列。流程图如下:

计算完成后,A6中的结果和A3中是相同的。
在esProc中,还可以不使用for循环语句,而使用循环函数来实现循环计算:

8/n.(x)  
9>a>0,b=1  
10=A1.((b=a+b,a=b-a))  

 A9中初始设定为第0项和第1项的值,在A10的循环函数中,每次计算出下一项的值赋值给b,并把原有的b值即当前项的值赋给a同时把数列的当前项设为a。使用循环参数,可以使代码量有效精简,流程图如下:

A10中的计算结果和A3是相同的。
还可以使用esProc中的子程序计算:

11/fun  
12=func(A13,A1)  
13funcif A13<=2return A13*[1]
14 =func(A13,A13-1)return B14|B14.m(-1)+B14.m(-2)

A13格后面的子程序部分,使用递归计算指定项数的斐波那契数列。在子程序中,使用if语句判断,将斐波那契数列的产生划分为两种情况,当项数小于等于2时,直接在每一项中填1;如果项数大于2,在B14中通过递归调用函数获得前n-1项,再计算最后两项的和,把结果添加到数列中。A12中的计算结果和A3是相同的。

比较这几种计算方法,可以发现,for循环的思路简单,理解比较容易;循环函数的代码量最少;而子程序调用的使用比较方便,代码的复用率比较高,更适用于需要重复同种计算的时候。在应用中,可以根据需要做出选择.

阅读更多
文章标签: 存储 c
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭