github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/leetcode/climbStairs_test.go (about)

     1  package leetcode
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  )
     7  
     8  //上台阶问题
     9  //n 阶楼梯 每次上1台阶或2台阶,共有多少种上法?
    10  
    11  func TestClimbStairs(t *testing.T) {
    12  	n := 4
    13  	fmt.Println(calcWays(n))
    14  	fmt.Println(calcWays2(n))
    15  }
    16  
    17  // 递归的写法
    18  func calcWays(n int) int {
    19  	if n == 1 { // 最后一个是1个台阶
    20  		return 1
    21  	}
    22  	if n == 2 {
    23  		return 2
    24  	}
    25  	return calcWays(n-1) + calcWays(n-2)
    26  
    27  }
    28  
    29  func calcWays2(n int) int {
    30  	// 记忆化搜索的方式 自顶向下的思维方式
    31  	if n == 1 { // 最后一个是1个台阶
    32  		return 1
    33  	}
    34  	v := make([]int, n+1)
    35  	v[0] = 1
    36  	v[1] = 1
    37  	for i := 2; i <= n; i++ {
    38  		if v[i] == 0 {
    39  			v[i] = v[i-1] + v[i-2]
    40  		}
    41  	}
    42  	return v[n]
    43  }
    44  
    45  func TestFib(t *testing.T) {
    46  	n := 5
    47  	t.Log(fib(n))
    48  	t.Log(fib2(n))
    49  	t.Log(fib3(n))
    50  }
    51  
    52  // 递归写法
    53  func fib2(n int) int {
    54  	if n <= 0 {
    55  		return 0
    56  	}
    57  	if n <= 2 {
    58  		return 1
    59  	}
    60  	// 此处fib2 会有很多重复计算
    61  	return fib2(n-1) + fib2(n-2)
    62  }
    63  
    64  // 动态规划的方式
    65  func fib3(n int) int {
    66  	if n <= 0 {
    67  		return 0
    68  	}
    69  	if n <= 2 {
    70  		return 1
    71  	}
    72  	// 数组记录前n
    73  	v := make([]int, n+1)
    74  	v[1] = 1
    75  	v[2] = 1
    76  	for i := 3; i <= n; i++ {
    77  		if v[i] == 0 {
    78  			v[i] = v[i-1] + v[i-2]
    79  		}
    80  	}
    81  
    82  	return v[n]
    83  }
    84  
    85  func fib(n int) int {
    86  	if n <= 0 {
    87  		return 0
    88  	}
    89  	if n <= 2 {
    90  		return 1
    91  	}
    92  	n1 := 1
    93  	n2 := 1
    94  	for i := 0; i < n-1; i++ {
    95  		n1, n2 = n2, n1+n2
    96  	}
    97  	return n1
    98  }