求满足条件的长度为N的字符串的个数(斐波那契数列)

今天做到了一道题目,初看时愣了一下,回过头在做的时候忽然发现其实是斐波那契数列。

原题大概是这样的:

条件1:字符串只包含‘0’或 ‘1’;
条件2:字符串只能以‘1’开始;
条件3:字符串不能够包含‘00’的组合;
问:长度为N的字符串的合法的组合到底有几种可能性?

解:

这里先记录一下自己的思考过程:
字符串起始只能是‘1’,所以实际上就是问(长度为N-1的字符串全部的组合数-包含‘00’的组合数)的大小;
考虑‘00’组合的个数进行组合,感觉之后处理会比较麻烦,就断了这个想法。

我们先写出长度为N的字符串的可能的组合数量:

len = 1(1)
output: 1

len = 2(10, 11)
output: 2

len = 3(101, 110, 111)
output: 3

len = 4(1010, 1011, 1101, 1110, 1111)
output: 5

其实写到这里,我们大致已经发现了规律:F(N) = F(N - 1) + F(N - 2)

证明:
假设,长度为N所有合法的字符串中,末尾为‘0’的字符串的个数为x,末尾为‘1’的字符串的个数为y;
F(N) = x + y;

则,此时长度为N + 1的所有合法的字符串中,末尾为‘0’的字符串只能从长度为N的末尾为‘1’的字符串变化而来才是合法的,所以长度为N + 1的合法字符串中末尾为‘0’的字符串的个数为y;末尾为1的字符串个数为x + y;
F(N + 1) = x + 2 * y;

此时长度为N + 2的所有合法的字符串中,末尾为‘0’的字符串只能从长度为N + 1的末尾为‘1’的字符串变化而来才是合法的,所以长度为N + 2的合法字符串中末尾为‘0’的字符串的个数为 x + y;末尾为1的字符串个数为x + 2 * y;
F(N + 2) = 2 * x + 3 * y;

在数值上可以得到:F(N + 2) = F(N + 1) + F(N)

证毕。

### 回答1: 斐波那契数列是指每个数都是前两个数之和的数列,第一个数和第二个数都是1。根据这个定义,可以用程序来斐波那契数列的前20个数,并且每行输出5个数。以下是Python语言的程序示例: ```python a, b = 1, 1 # 定义初始值 count = 0 # 计数器 while count < 20: print(a, end=' ') count += 1 if count % 5 == 0: # 每行输出5个数 print() a, b = b, a + b # 更新a和b的值,下一个数 ``` 程序的运行结果如下所示: ``` 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 ``` 上述程序利用while循环计算斐波那契数列的前20个数,并在每行输出5个数。其中,变量a和b分别代表当前数列中的前两个数,count变量记录当前已经输出的数的个数。在循环过程中,每次输出a的值,然后更新a和b的值,下一个数。当输出的数的个数是5的倍数时,程序就会换行输出下一行的数。 ### 回答2: 下面是斐波那契数列前20个数的Python程序: ```python def fibonacci(n): if n <= 0: return [] elif n == 1: return [0] elif n == 2: return [0, 1] else: sequence = [0, 1] for i in range(2, n): sequence.append(sequence[i - 1] + sequence[i - 2]) return sequence sequence = fibonacci(20) # 每行输出5个数 for i in range(0, len(sequence), 5): line = " ".join(str(x) for x in sequence[i:i + 5]) print(line) ``` 这个程序首先定义了一个`fibonacci`函数,用于生成斐波那契数列。然后调用该函数得前20个斐波那契数,并将结果存储在`sequence`列表中。 接下来,程序使用一个循环对`sequence`进行遍历,并以每行5个数的形式输出。`range(0, len(sequence), 5)`表示从0开始,每次增加5,直到遍历完`sequence`列表为止。`sequence[i:i + 5]`表示从索引`i`到索引`i+5`的子列表。最后,使用字符串的`join`方法将子列表中的元素转换为字符串,并用空格分隔,得到一行输出。通过循环迭代,程序输出了`\n`换行符分隔的多行,每行包含5个斐波那契数。 ### 回答3: 斐波那契数列是一个数列,其中每个数字是前两个数字的和,起始数字为0和1。我们可以使用编程语言写一个程序来斐波那契数列的前20个数,并且每行输出5个数字。 下面是使用Python语言的示例代码: ```python # 初始化前两个数字 num1 = 0 num2 = 1 # 创建一个空列表用于存储斐波那契数列 fibonacci_list = [] # 循环计算前20个数字,并将其添加到列表中 for i in range(20): # 将当前数字添加到列表中 fibonacci_list.append(num1) # 计算下一个数字 next_num = num1 + num2 # 更新前两个数字 num1 = num2 num2 = next_num # 输出斐波那契数列 for i in range(20): # 每行输出5个数字 if i % 5 == 0: print("\n") print(fibonacci_list[i], end=" ") ``` 运行这段代码,将得到以下输出: ``` 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 ``` 这样,我们就成功地得了斐波那契数列的前20个数字,并且按照每行5个数字的格式进行了输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值