- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这个问题之前有一些混淆。之前,发帖者和回复者认为这是一个计算第 n 个斐波纳契数的函数,但实际上它是计算第 n 个斐波纳契数的有效函数,作为 Stack Exchange 上 codegolf 的编程难题。
f(n){int i=1,j=0,k;for(;n;n-=k==i)for(j=i-j,i+=j,k=2;i%k&&k++<i;);return i;}
这是来自
的C 76字符示例https://codegolf.stackexchange.com/questions/6994/find-the-nth-fibonnaci-prime-in-the-shortest-code
对于 32 位有符号整数,n 的范围是 1 到 10。前 10 个斐波那契素数是:2、3、5、13、89、233、1597、28657、514229、433494437。
问题是这个函数是如何工作的?
codegolf 上的原始来源不包含解释。这可能属于 codegolf,但上一个问题是在 SO 此处提出的,我希望上一个问题的发帖人能看到这个问题并得到他/她的问题的回答。
最佳答案
让我们先缩进:
int f(int n)
{
int i = 1, j = 0, k;
for (; n; n -= k == i)
for (j = i - j, i += j, k = 2; i % k && k++ < i;) ;
return i;
}
n
对于合理的输入是非零的,所以第一个循环将执行。注意 k == i
尚未评估,因为第一个 for
的正文必须先执行,所以 k
没关系未初始化。
要对此进行更多数学演示,请注意 j = f(0) = 0
和 i = f(2) = 1
是第一个和第三个斐波那契数列。以 n = 2
开头, j = f(n-2) = 0
, i = f(n) = 1
,为了推进 j 和 i,我们有:
j = i - j = f(n) - f(n-2) = f(n-1)
i = i + j = f(n) + f(n-1) = f(n+1)
n = n + 1
对于每个外循环,i
和 j
在内部循环的初始化中前进到下一个斐波那契数。
j = 1 == f(1), i = 2 == f(3)
j = 1 == f(2), i = 3 == f(4)
j = 2 == f(3), i = 5 == f(5)
j = 3 == f(4), i = 8 == f(6)
j = 5 == f(5), i = 13 == f(7)
这证实了我们的模式:我们可以从前几次迭代中看到 i
比j
提前两步.
i % k && k++ < i
这只是一个素数测试:它在 k
时停止等于i
(如果 i
是质数,就会发生这种情况——而且 k++ < i
在技术上永远不会不为真,因为第一个条件将首先评估为假,但它有一个有用的副作用)或当 k
时是 i
的适当除数(所以 i
不是质数)。这不是最有效的方法,但它确实有效。
放 k++
在 for
的条件部分loop 具有正确递增它并保存更多字符的效果(好吧,我认为只有一个)。
n -= k == i
如果i
不是质数,这不会改变n
,因此将检查下一个斐波那契数列(因为 i
遍历斐波那契数列)。如果i
是质数,然后递减 n
,它会倒数我们找到的斐波那契素数的数量,并且无论如何都会检查下一个素数。当它到达 0
, 我们会找到 n
The question is how does this function work?
它的工作原理是按顺序计算斐波那契数并测试每个数的素数,直到找到 n
这样的素数。
稍微清理一下代码,就没什么特别的了。大部分只是很多人会写的蛮力算法,尽管由于素数检查而效率较低,并且由于想要保存尽可能多的字符而更难阅读。
最突出的部分是 i
的计算和 j
,其中 i
比 j
提前两步.这个技巧可能也有保存最多字符的效果。
关于c - 编程难题 - 斐波那契,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32126804/
我想将 JavaScript 函数移动到 来自输入标签的标签,但它不起作用。 这个有效: 这不是: function FieldOnKeyUp() { this.value=this.
我遇到了这个问题:说给定两个权重1和3,您可以权衡1,2(乘以3-1),3,4(乘以3 + 1)(使用平衡的两面)。现在找到最小的砝码数量,以便可以测量1到1000。 答案是1,3,9,27 ...
这是代码 war 的套路,我似乎无法弄明白。我以前从未使用过 JavaScript。 我知道答案可能很简单,但即使经过许多小时的搜索,我似乎也无法弄清楚他们在寻找什么。我知道 greet 函数中的 n
在完成一项学校作业时,我有一个抽象类 Person、一个扩展 Person 的抽象类 Student 和一个扩展学生的普通类 CollegeStudent。 CollegeStudent 从文件中读取
下面的代码让我很头疼 var somearr = [1, 2, 3]; function operations() { for (var i
我在 3 个文件中有以下代码: Defines.h #ifndef Defines_h extern const unsigned int SIZE; #endif Defines.cpp #incl
我的任务是尝试创建一个从文本文档中删除个人信息的自动化系统。 电子邮件、电话号码相对容易删除。名字不是。这个问题很难,因为文档中有需要保留的名称(例如,引用资料、名人、人物等)。需要从内容中删除作者姓
我卡在这里了... #include #define DBG_LVL(lvl, stmt) \ do{ \ if(lvl>1) printf stmt; \ }while(0) #defi
我正在尝试使用动态编程解决类似桥梁和 torch 的问题。有关此问题的更多信息,请参见维基百科 (http://en.wikipedia.org/wiki/Bridge_and_torch_probl
我有数组 A[0...N]的 double和数组 B[0...N]的 int .每B[i]变化在 [0...P] .我只需要计算数组 C[0...P] : C[j] = SUM( A[i] : B[i
我目前在使用 jQuery 中的scrollTop() 函数时遇到困难。目前,平滑滚动功能正在滚动经过预期部分,然后在功能完成运行后弹回该部分。我在本文末尾添加了一个 jsFiddle,但这是我目前的
PHP代码 $t = strtotime( '2012-09-21T03:00:00+00:00 America/Chicago' ); $t2 = date('c',$t); echo $t2;
我知道使用 .运算符将函数链接在一起,如下所示: isLessThanZero x | x a -> a -> a 还可以看到: subtract :: Num a => a -> (a ->
PHP代码 $t = strtotime( '2012-09-21T03:00:00+00:00 America/Chicago' ); $t2 = date('c',$t); echo $t2;
我创建了两个 jar 文件 my.common.jar,其中包含辅助类和方法(主要是静态方法)。我还创建了一个 jar 文件 test.jar,其中包含一个 main 方法,该方法调用 my.comm
已解决:@Desolator 已让我的代码在下面的评论中完全正常工作 好的,所以我创建了 3 个类,它们都相互链接: 启动画面 > 项目分配 > CompareSignature 我想谈论的类是闪屏类
我正在尝试使用 firestore 的 .where() 功能来检测某个字符串是否在数据库的数组中。我曾尝试通过添加方括号和其他东西来表示数组的一部分来操纵函数的第一个参数,但无济于事。 //in t
我有一个 PHP 系统,允许用户以 1 - 5 的范围对照片进行投票,我想要做的是突出显示两个人给彼此相同的投票/分数的地方。我目前无法弄清楚我的 PHP 函数的 SQL。 数据库看起来像这样 id,
我在使用 SQLAlchemy 处理 Unicode 时遇到了一个奇怪的问题。简而言之,当我将 Python unicode 字符串插入 Unicode 列时我的 MySQL 数据库,我可以毫不费力地
我正在尝试使用 Selenium 自动执行 Google 翻译网络界面(但无需了解 Selenium 即可理解此问题,只需要知道它会找到元素并单击它们即可)。我一直在选择要翻译的语言。 我无法打开下拉
我是一名优秀的程序员,十分优秀!