FIBONACCI-顺推

公元1202年欧洲数学家伦纳德·斐波那契在他所著的《珠算的书》(Liber Abbaci)中有这样一道习题:假定每对兔子每个月生出一对兔子。新生的兔子一个月后有了生育能力,再过一个月又生出一对兔子。那么买一对新生的兔子回来,一年后有多少对兔子?

显然,第一个月有一对,第二个月还是一对,第三个月有两对,第四个月有三对,第五个月有五对……容易推得,某月的兔子数正好是前两个月兔子数之和。如果用F(n)表示第n个月的兔子数,则当n>2时有:

F(n)=F(n1)+F(n2) n3

F(1)=F(2)=1

若定义F(0)=1,则可以写成:

F(n)=F(n1)+F(n2)n2

F(0)=1,F(1)=1

这个数列称为斐波那契数列。上面的表达式是该数列的递归定义,其终止条件是n=1n=1,递归形式是F(n)=F(n1)+F(n2)。即当n2时,函数F(n)用它本身在自变量较小的两个点处的值来(递归)表示,这个递归表示向着终止条件(n=0,n=1)变化,所以这个问题可以递归求解。可以写一个VB的函数过程来计算第n个斐波那契数。

当n=5时,fib(5)的计算过程如下:

fib(5)

=fib(4) + fib(3)

=(fib(3) + fib(2)) + (fib(2) + fib(1))

=((fib(2) + fib(1)) + (fib(1) + fib(0))) +((fib(1) + fib(0)) + fib(1))

=(((fib(1) + fib(0)) + fib(1)) + (fib(1) +fib(0))) + ((fib(1) + fib(0)) + fib(1))

=1+0+1+0+1+0+0+1=5

以下是用顺推法计算FIBONACCI数列

'//程序用以计算斐波那契函数
Public arrOut()
Sub Fibonacci()
Dim n As Integer, Result As Integer
With Sheet2
n = .Cells(2, 2)
ReDim arrOut(0 To n + 1, 1 To 2)
'输出
Result = Fibo(n)    '求最值
.Cells(3, 2) = Result
.Cells(6, 1).Resize(UBound(arrOut), UBound(arrOut, 2)) = arrOut
End With
End Sub
'Main Program
Function Fibo(n)
If n = 0 Then
  Fibo = 0
ElseIf n = 1 Then
  Fibo = 1
Else
  Fibo = Fibo(n - 2) + Fibo(n - 1)
End If
  arrOut(n, 1) = n: arrOut(n, 2) = Fibo

End Function



 


'//程序用以计算斐波那契函数
Public arrOut()
Sub Fibonacci()
Dim n As Integer, Result As Integer
With Sheet2
n = .Cells(2, 2)
ReDim arrOut(0 To n + 1, 1 To 2)
'输出
Result = Fibo(n)    '求最值
.Cells(3, 2) = Result
.Cells(6, 1).Resize(UBound(arrOut), UBound(arrOut, 2)) = arrOut
End With
End Sub
'Main Program
Function Fibo(n)
If n = 0 Then
  Fibo = 0
ElseIf n = 1 Then
  Fibo = 1
Else
  Fibo = Fibo(n - 2) + Fibo(n - 1)
End If
  arrOut(n, 1) = n: arrOut(n, 2) = Fibo
End Function


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值