fibonacci<-function(i)
{
if(i==1||i==2)
return (1)
return (fibonacci(i-1)+fibonacci(i-2))
}
for(i in 1:12)
{
print(fibonacci(i))
}
# loop
a=1
b=1
for(idx in 1:12)
{
print(a)
c=a+b
a=b
b=c
}
Option ExplicitDim X() As Long
Sub Fun(ByRef A() As Long)
Dim J As Integer
X(1) = 1
X(2) = X(1)
For J = 3 To UBound(A)
X(J) = X(J - 1) + X(J - 2)
Next J
End Sub
Private Sub Form_Load()
Dim I As Integer, n As Integer
Form1.AutoRedraw = True
Do
n = Val(InputBox("请输入数列的项数(n>2)"))
Loop Until n >2
ReDim X(1 To n)
Fun X()
For I = 1 To n
Print X(I),
If I Mod 5 = 0 Then Print
Next I
End Sub
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。斐波那契数列指的是这样一个数列:
0、1、1、2、3、5、8、13、21、34……
有一组数列,它的第一项为1,第二项为1,从第三项开始,每一项为前两项之和。
斐波那契数列的第n项Fn可以通过如下的递归公式定义:
F(1)=1,F(2)=1,
F(n)=F(n-1)+F(n-2)(n ≥ 3,n ∈ N*)
通项公式
如上,又称为“比内公式”,是用无理数表示有理数的一个范例。
注:此时a1=1,a2=1,a(n)=a(n-1)+a(n-2),(n ≥ 3,n ∈ N*)
求第n项斐波那契数
现在写一个函数int fib(int n) 返回第n项Fn。例如,若n=0,则函数fib(0)应该返回0,若n=1, 则函数fib(1)应返回1,若 n >1,返回 F(n-1)+F(n-2)。
若n = 9
输出:34
下面是返回斐波那契数列第n项Fn的不同方法:
方法1 (使用递归)
一个简捷的方法是直接使用递归定义关系式写出递归实现的代码,C/C++代码如下:
//Fibonacci Series using Recursion
#include<stdio.h>
int fib(int n) {
if (n <= 1)
return n
return fib(n - 1) + fib(n - 2)
}
int main() {
int n = 9
printf("%d", fib(n))
return 0
}
输出:34
时间复杂度:T(n) = T(n-1) + T(n-2),该时间复杂度是指数级别的
空间复杂度:如果考虑递归调用时栈的大小,则为O(n) ;如果不考虑调用栈的话,则为O(1)
通过观察,我们可以发现递归求解时做了很多重复的工作(见下面的递归调用树)。因此采用递归方式求解斐波那契数列的第n项Fn不是一种好的方法。