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 }