算法-爬楼梯问题

2018-04-28  本文已影响0人  hu_luo_tong

一个N阶的楼梯,每次能1或着2阶,问走n阶的楼梯有多少种走法?

分析可知在走第n阶的时候,是与第n-1阶和n-2阶有关系的。用户走到第n阶的方法应该是用户走到第n-1 n-2阶的和。使用数学表达式应该 如下:


当n=1 或者n=2 时,f(n) = 1,所以我们可以考虑使用递归来实现

   func ClimbStarisRecursion(n int) int{
          if n == 1 || n == 0{
              return 1
          }
          
          return ClimbStarisRecursion(n-2) + ClimbStarisRecursion(n-1)
     }

     func main(){
          step := 20
         fmt.Println(ClimbStarisRecursion(20))
     }

一般递归问题可以转换为动态规划问题来处理,相比于递归算法伴随这会伴随着较多的出栈入栈操作消耗,我们使用动态规划算法性能会优于递归算法,下面我们给出动态规划的版本

    func ClimbStarisDP(n int) int{
         pre := 1
         now := 1
         var tmp int
         for i := 2;i <= n;i++{
             tmp = now
             now = pre + now
             pre = tmp
        }   
        return now
    }

算法问题的计算过程中,最重要的抽象出问题中的数学模型,然后根据数学模型找到合适的计算方法(递归,动态规划,贪婪算法)进行代入求解是否能够得到需要的问题。

上一篇下一篇

猜你喜欢

热点阅读