题目:
一个共有20个台阶的楼梯,从下面走到上面。一次只能迈一个台阶或两个台阶,并且不能后退,走完这个楼梯共有多少种方法。
分析:
1 步台阶只有1种走法(1)
2步台阶2种(11、2)
3步台阶有3种(111、12、21)
4 步台阶有5种(1111、112、121、211、22)
5 步台阶有8种(11111、1112、1121、1211、122、2111、212、221)
6步台阶有13种(111111、11112、11121、11211、1122、12111,1212、1221、2111、2112、2121、2211、222)
可以发现每一个台阶数的走法对应为比它少一步各种走法前加一个1步和比它少两步的走法前加一个2步,并构成一个Fibonacci数列。
代码如下:
Private Sub Command1_Click()
Dim s() As String, num As Long, i As Long
For i = 1 To 10
upstairs i, s, num
Debug.Print Join(s, vbCrLf)
Debug.Print num & " 种走法"
Next
End Sub
Sub upstairs(ByVal stairnum As Integer, ByRef steps() As String, ByRef methodn As Long)'将stairnum台阶时的所有可能走法以类似“111222 ”格式保存在数组steps()中,走法数目保存在methodn中
Dim i As Long
If stairnum = 1 Then
methodn = 1
ReDim steps(1 To methodn)
steps(1) = 1
End If
If stairnum = 2 Then
methodn = 2
ReDim steps(1 To methodn)
steps(1) = 11
steps(2) = 2
End If
If stairnum > 2 Then
Dim a() As String, b() As String, methoda As Long, methodb As Long
upstairs stairnum - 1, a, methoda ’递归调用
upstairs stairnum - 2, b, methodb '递归调用
ReDim steps(methoda + methodb)
For i = 1 To methoda
steps(i) = 1 & a(i)
Next
For i = 1 To methodb
steps(i + methoda) = 2 & b(i)
Next
methodn = methoda + methodb
End If
End Sub