【问题标题】:Fibonacci string array斐波那契字符串数组
【发布时间】:2011-03-18 14:04:32
【问题描述】:

我有一个数组:A B AB BAB ABBAB BABABBAB ... 数组中每一项的个数是基于斐波那契数。将第 n 个字符串和第 n+1 个字符串放在一起,然后产生第 n+2 个字符串,例如 BABABBAB = BAB + ABBAB。 那么第 10^16 个字母是 A 还是 B?

【问题讨论】:

  • 你不应该写一个程序来告诉你这个吗?
  • 标记为作业,因为我认为它是。没有人会为你做功课,因为你需要学习,但如果你更具体地知道你卡在哪里,那么我们会给你提示。
  • 听起来像家庭作业...到目前为止您尝试过什么?你的解决方案有什么问题?
  • @Mr.失望:我喜欢你的评论和你的用户名的组合。太搞笑了。
  • 是A B. ...但如果不是A B,那肯定是B A。

标签: arrays algorithm string


【解决方案1】:

f[n] 成为nth fibonacci number

假设我们要在连接f[1], f[2], ..., f[n]得到的字符串中找到位置x的值。

  1. 找到最低的k 使得f[1] + f[2] + ... + f[k] >= x。所以位置x 属于具有f[k] 字符的单词(至少在它的串联中。但是由于所有单词都是由ab 组成的,我们将尝试将问题减少到那些二)。
  2. 要在术语f[k] 中找到与x 对应的位置,请从x 中减去f[1] + ... + f[k - 1]
  3. 如果k = 1打印a,如果k = 2打印b,否则转到步骤4。
    1. 如果f[k - 2] < x,那么我们要查找的位置在对应于(带长度)f[k - 1] 的单词中。将kf[k - 2]x 中减去1,然后转到第3 步
    2. 否则,我们要查找的位置在与f[k - 2] 对应的单词中。从k 中减去 2,保持x 不变,然后转到步骤 3

这不需要生成实际的单词,只需要生成它们的长度,即基本的斐波那契数。

工作示例 - 请注意,我只是出于说明目的使用实际单词,它们不是必需的。

n  f[n]  corresponding word
1  1     a
2  1     b
3  2     ab
4  3     bab
5  5     abbab 
6  8     bababbab

连接所有这些我们得到:ababbababbabbababbab。让我们问问自己10(它是b)的位置是什么。

1. f[1] + f[2] + f[3] + f[4] + f[5] >= 10, so k = 5
2. x = 10, f[1] + f[2] + f[3] + f[4] = 7, so subtract 7 from x, giving x = 3
3'. k isn't 1 or 2, skip this.
4'. f[k - 2 = 3] = 2 < x. k = 4, x = 1
3''. still ignoring this.
4'' f[k - 2 = 2] = 1 >= x. k = 2, x = 1
3'''. k = 2, print 'b'.

【讨论】:

  • 斐波那契数的定义:f[1] = 1, f[2] = 1, f[n] = f[n-1] + f[n-2]。如果你记得以前的值,你可以很快计算出下一个值。不要尝试通过递归来做到这一点。
  • 这可能很方便:f[1]+f[2]+...+f[n]=f[n+2]-1
【解决方案2】:

请不要把这个答案看得太严重:

我从来都不是好数学,这听起来像这个任务应该太重,如果没有一个怪异的算法来计算,所以我的解决方案是简单地猜测。要在AB 之间进行选择,我会在 php 中编写一个类似这样的非常简单的程序来打印前 15 或 20 个“行”:

<?php
$var1 = "B";
$var2 = "A";
for($i=3;$i<=15;$i++){
    $tmp = $var2;
    $var2 = $var1;
    $var1 = $tmp.$var1;
    echo $i." ".$var1."<br>";
}
echo strlen(implode('',explode('B',$var1)));
echo "<br>";
echo strlen(implode('',explode('A',$var1)));
?>

结果显示As (38%) 总是比Bs (62%) 少 - 所以猜测B 时正确的机会并没有那么糟糕。

【讨论】:

  • 不错! +1。到目前为止,这是今天最好的问题。
  • 这个答案值得评论的是,第n个字符串的长度为f[n],包含f[n-1]个B和f[n-2]个A,所以B的比例是(sqrt(5)-1)/2。 62% 的估计一点也不差:)
  • 感谢您鼓舞人心的作品!我一直忽略概率论的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2015-06-05
  • 2014-05-23
  • 2014-05-03
相关资源
最近更新 更多