zoukankan      html  css  js  c++  java
  • 关于走楼梯的递归算法

    题目:

    一个共有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

  • 相关阅读:
    C/C++数组名与指针区别深入探索(转)
    mysql 的编译安装
    rpm的问题 ~/.rpmmacros %_rpmlock_path
    GCC中的弱符号与强符号(转)
    关于printf系列函数
    如何修改机器名
    multiple definition of XXXX 的解决
    由无名对象(临时对象)引发的关于“引用”的思考
    关于date中时间字符串的格式
    月薪不同,面试题不同!
  • 原文地址:https://www.cnblogs.com/fengju/p/6336390.html
Copyright © 2011-2022 走看看