返回

智趣闯关,揭晓「外观数列」的第 n 项奥秘!

前端

「外观数列」是一个数字序列,从数字 1 开始,序列中的每一项都是对前一项的。那么,如何求出「外观数列」的第 n 项呢?

首先,我们需要了解「外观数列」的生成规则。以「外观数列」的前几项为例:

  1. 1
  2. 11
  3. 21
  4. 1211
  5. 111221

从这些数字中,我们可以发现「外观数列」的生成规则是:

  1. 从数字 1 开始。
  2. 对于「外观数列」中的任意一项,将其中的数字按照连续出现的个数进行分组。
  3. 将分组后的数字按照其个数和数字本身组合起来,得到下一项。

比如,对于「外观数列」的第三项 21,我们将其中的数字按照连续出现的个数进行分组,得到 2 和 1。然后,将分组后的数字按照其个数和数字本身组合起来,得到下一项 1211。

现在,我们已经了解了「外观数列」的生成规则,那么如何求出它的第 n 项呢?

一种方法是使用递归。我们可以编写一个函数,该函数接收一个正整数 n 作为参数,并返回「外观数列」的第 n 项。函数的伪代码如下:

def get_外观数列(n):
  if n == 1:
    return "1"
  else:
    previous_item = get_外观数列(n - 1)
    result = ""
    count = 1
    for i in range(len(previous_item)):
      if i < len(previous_item) - 1 and previous_item[i] == previous_item[i + 1]:
        count += 1
      else:
        result += str(count) + previous_item[i]
        count = 1
    return result

另一种方法是使用迭代。我们可以创建一个循环,从 1 开始,依次生成「外观数列」的每一项。直到生成第 n 项为止。循环的伪代码如下:

def get_外观数列(n):
  result = "1"
  for i in range(1, n):
    previous_item = result
    result = ""
    count = 1
    for j in range(len(previous_item)):
      if j < len(previous_item) - 1 and previous_item[j] == previous_item[j + 1]:
        count += 1
      else:
        result += str(count) + previous_item[j]
        count = 1
  return result

无论使用哪种方法,我们都可以求出「外观数列」的第 n 项。

总而言之,「外观数列」是一个有趣的数字序列,其生成规则并不复杂,但它却蕴含着丰富的数学知识。如果对数学感兴趣,不妨挑战一下,看看自己能不能编写出求解「外观数列」第 n 项的代码。