台阶问题 - Go 语言实现

// 台阶问题
// 有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式

//例如:
//N=8;K=3
// 3 3 [2, (2)(1,1)]    = 3 + 6 =9
// 3 [5, (2,2,1),(2,1,1,1),(1,1,1,1,1)] = 38
// 0 [8, (2,2,2,2), (2,2,2,1,1), (2,2,1,1,1,1),(2,1,1,1,1,1,1),(1,1,1,1,1,1,1,1)] = 34

//N=5;K=2
// 2 2 [1 (1)] = 3
// 2 [3 (1,1,1)] = 4
// 0 [5, (1,1,1,1,1)] = 1

Go:
package main

import "fmt"

// N个阶梯(递归法), K = N
func countStep(N int) int{
	step := 0
	if N <= 1  { return 1 }
	for i:=1;i<N+1;i++ { step = step + countStep(N-i) }
	return step
}

// N个阶梯(递归法), K = L
func countStep1(N int, L int) int{
	step := 0
	if N <= 1  { return 1 }
	for i:=1;i<N+1;i++ {
		if i > L {
			break
		}
		step = step + countStep1(N-i, L)
	}

	return step
}

// N个阶梯(递归法), K 是 N中非连续的值
func countStep2(N int, L map[int]int) int{
	step := 0
	if N <= 1  { return 1 }
	for i:=1;i<N+1;i++ {
		if _, ok:=L[i]; ok {
			step = step + countStep2(N-i, L)
		}
	}

	return step
}

// N个阶梯(递归法), K = 1,2
func countStep3(N int) int{
	if N <= 2 { return N }
	step := countStep3(N-1) + countStep3(N-2)
	return step
}

// N个阶梯(遍历法), K = 1,2,3
func countStep4(N int) int{
	if N <= 3 { return N }
	s1, s2, s3 := 1, 2, 4
	sum := 0
	for i := 4; i <= N; i++ {
		sum = s1 + s2 + s3
		s1 = s2
		s2 = s3
		s3 = sum
	}
	return sum
}

// N个阶梯(遍历法), K = 1,3
func countStep5(N int) int{
	s1 := 1
	sum := 0
	tmp1 := 0
	tmp2 := 0
	for i := 1; i <= N; i++ {
		if i%2==0 {
			sum = s1 + tmp2
			tmp2 = s1
		}else{
			sum = s1 + tmp1
			tmp1 = s1
		}
		s1 = sum
	}
	return sum
}

// N个阶梯(递归法), K = 1,3
func countStep6(N int) int{
	if N < 3 { return 1 }
	if N == 3 { return 2 }
	step := countStep6(N-1) + countStep6(N-3)
	return step
}


func main() {
	//普遍的遍历法性能要比递归好很多
	N := 10
	K1 := 2
	K2 := map[int]int{1:1,3:3}
	//10个台阶,最多迈10个台阶,有多少种方法
	fmt.Println(countStep(N))
	//10个台阶,最多迈2个台阶,有多少种方法
	fmt.Println(countStep1(N, K1))
	//10个台阶,最多只能迈1和3个台阶,有多少种方法
	fmt.Println(countStep2(N, K2))
	//10个台阶,最多只能迈1和3个台阶,有多少种方法 - (性能最好)
	fmt.Println(countStep5(N))
	//10个台阶,最多只能迈1和3个台阶,有多少种方法
	fmt.Println(countStep6(N))

}



#笔试题目#
全部评论

相关推荐

06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务