台阶问题 - 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))

}



#笔试题目#
全部评论

相关推荐

测试糕手手:社会第一课,随便吹牛逼,直接说四个月,别老实。老实人只会被欺负
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 18:35
简历上把1个月实习写成了3个月,会进行背调吗?
码农索隆:一个月有一个月的实习经历,三个月有三个月的实习经历
简历当中有水分算不算造假...
点赞 评论 收藏
分享
下北澤大天使:你是我见过最美的牛客女孩😍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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