返回
揭秘外观数列的奥秘:从概念到算法
前端
2023-10-28 04:39:17
外观数列:一个自我的递归
外观数列是一个奇妙的整数序列,从数字 1 开始,其中每一项都了前一项的“外观”。例如,序列的前几项为:
1
11
21
1211
111221
仔细观察可以发现,每一项都了前一项中连续数字出现的次数。例如,"21" 表示前一项 "11" 中有两个 1 连续出现。而 "1211" 则表示前一项 "21" 中有一个 2 和两个 1 连续出现。
算法实现:递归与动态规划
生成外观数列有两种主要方法:递归和动态规划。
递归方法
递归方法基于这样一个事实:外观数列的第 n 项可以通过以下递归关系式计算:
f(n) = f(n-1).replaceAll("k", "k+1")
其中 f(n) 表示外观数列的第 n 项,replaceAll 操作将所有连续的相同数字替换为其数量加 1。
动态规划方法
动态规划方法通过构建一个表来存储外观数列的前 n 项。表中的每一行都存储外观数列的一项,每一列都存储特定数字的连续出现次数。
代码示例:Python
递归方法
def countAndSay(n):
if n == 1:
return "1"
else:
return countAndSay(n-1).replaceAll("k", "k+1")
动态规划方法
def countAndSay(n):
dp = [""] * (n+1)
dp[1] = "1"
for i in range(2, n+1):
count = 1
prev = dp[i-1][0]
for j in range(1, len(dp[i-1])):
if dp[i-1][j] == prev:
count += 1
else:
dp[i] += str(count) + prev
prev = dp[i-1][j]
count = 1
dp[i] += str(count) + prev
return dp[n]
结语
外观数列是一个引人入胜的数学概念,它在算法和计算机科学中有着广泛的应用。通过递归或动态规划方法,我们可以轻松生成外观数列的任何项。
希望这篇文章对您理解外观数列及其算法提供了清晰且有用的见解。如果您有任何问题或希望进一步探讨相关主题,请随时与我联系。