计算斐波那契数列的前 N 项
斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、……
这个数列从第三项开始,每一项都等于前两项之和。
输出这个数列的前 N 项(N>2)。
定义一个序列,将前两项赋值为 1,然后循环 N-2次,分别取倒数第一项和倒数第二项,将其相加的和合并到序列中,结果即为所生成的斐波那契数列。
使用递推算法:
A | B | C | |
1 | 30 | [1,1] | |
2 | for A1-2 | =B1.m(-1)+B1.m(-2) | >B1|=B2 |
https://try.esproc.com/splx?54T
A1是N值,B1中创建初始数列[1,1]。
A2循环N-2次,B2计算序列中最后两项的和,C2将新值添加到原数列中。循环完成后,即可在B1中看到最终结果。
SPL中使用for循环,便于查看每一步的计算结果,用A.m(n)可以从序列中按位置取数,n为负值倒数;A =A|a可以很方便地在序列后添加成员。
也可以使用循环函数计算:
A | B | C | |
1 | 30 | >a=0,b=1 | |
2 | =A1.(b=a+b,a=b-a) |
https://try.esproc.com/splx?2BO
B1中定义计算所需参数的初始值a=0,b=1。A2用循环函数依次计算数列中的N个值,每次计算时a+b得到新的b,用新的b减去a能得到b的原值作为当前数列中的值,同时将其赋值给a。执行后,在A2中能得到最终结果。
SPL中循环函数能用一个格子完成for循环中用多个格子甚至多行才能完成的计算,代码更简洁。使用逗号运算符a,b,…,会依次计算表达式a,b,…并返回最后一个结果。实际上,甚至可以把代码简化为一个表达式:=a=0,b=1,30.(b=a+b,a=b-a)
A | B | C | |
1 | 30 | =fibonacci(A1) | |
2 | func fibonacci(n) | if n < 3 | return [1]*n |
3 | =fibonacci(n-1) | return B3|(B3.m(-1)+B3.m(-2)) |
https://try.esproc.com/splx?2K1
先看A2代码块中定义的子程序,子程序名称为fibonacci,使用一个参数n表示项数。在B2中判断,如果n小于3则按返回1组成的n项数列;n≥3时,先在B3中递归调用子程序,得到n-1项的斐波那契数列,在C3中再增加新的一项即可返回n项的结果。
在C1中可以直接用=fibonacci(N)得到所需的结果。
在SPL中,通过使用子程序,调用代码会非常简洁,特别是在子程序需要重复使用时。
使用上面的3种方法,得到的结果是相同的:
英文版