我理解Big-O表示法,但我不知道如何为许多函数计算它.特别是,我一直试图弄清楚Fibonacci序列的幼稚版本的计算复杂性:
int Fibonacci(int n)
{
if (n <= 1)
return n;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
Run Code Online (Sandbox Code Playgroud)
Fibonacci序列的计算复杂度是多少以及如何计算?
请解释这个简单的代码:
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
Run Code Online (Sandbox Code Playgroud)
我对最后一行感到困惑,特别是因为如果n = 5,那么将调用fibonacci(4)+ fibonacci(3)等等但是我不明白这个算法如何计算索引5处的值方法.请详细说明!
我最初错误地编写了程序.我没有在一个范围(即startNumber 1,endNumber 20应该=只有1和20之间的数字)之间返回Fibonacci数,而是为程序编写了显示范围之间的所有Fibonacci数(即startNumber 1,endNumber 20)显示=前20个斐波纳契数).我以为我有一个确定的代码.我也不明白为什么会这样.
startNumber = int(raw_input("Enter the start number here "))
endNumber = int(raw_input("Enter the end number here "))
def fib(n):
if n < 2:
return n
return fib(n-2) + fib(n-1)
print map(fib, range(startNumber, endNumber))
Run Code Online (Sandbox Code Playgroud)
有人在我的第二部分(因为重复而关闭 - /sf/ask/35293541/)指出我需要使用while循环通过生成器传递startNumber和endNumber.有人可以指点我如何做到这一点?欢迎任何帮助.
我是一名学习程序员,而且我遇到了一些混乱.我被要求编写一个程序,用于通过用户输入的起始编号和结束编号来计算和显示斐波纳契序列(即startNumber = 20 endNumber = 100,它将仅显示该范围之间的数字).诀窍是包含它(我不知道如何在Python中使用它? - 我假设这意味着使用包含范围?).
到目前为止我所拥有的不是实际编码,而是:
我不知道从哪里开始,我正在询问如何写这个的想法或见解.我也尝试过编写Fib序列论坛,但我也迷失了.
通过什么机制这个斐波那契函数被记忆了?
fib = (map fib' [0..] !!)
where fib' 1 = 1
fib' 2 = 1
fib' n = fib (n-2) + fib (n-1)
Run Code Online (Sandbox Code Playgroud)
在相关的说明中,为什么这个版本不是?
fib n = (map fib' [0..] !! n)
where fib' 1 = 1
fib' 2 = 1
fib' n = fib (n-2) + fib (n-1)
Run Code Online (Sandbox Code Playgroud) Fibonacci数字已经成为计算机科学学生递归的一个流行的介绍,并且有一个强烈的论据,即它们在自然界中存在.出于这些原因,我们很多人都熟悉它们.
它们也存在于其他地方的计算机科学中; 在基于序列的令人惊讶的有效数据结构和算法中.
我想到了两个主要的例子:
这些数字是否有某些特殊属性可以使它们优于其他数字序列?这是空间质量吗?他们还有哪些其他可能的应用程序?
这对我来说似乎很奇怪,因为在其他递归问题中有许多自然数字序列,但我从未见过加泰罗尼亚语堆.
是否有任何算法来计算子线性时间内的第n个斐波纳契数?
我知道如何制作Fibonacci数列表,但我不知道如何测试给定数字是否属于斐波纳契列表 - 记住的一种方法是生成fib列表.数字达到那个数字并查看它是否属于数组,但必须有另一种更简单,更快速的方法.
有任何想法吗 ?
有许多计算任意n的F(n)的方法,其中许多方法具有很大的运行时和内存使用率.
但是,假设我想问相反的问题:
给定F(n)n> 2,n是什么?
(由于F(1)= F(2)= 1并且没有明确的逆,因此n> 2限制在那里.
解决这个问题最有效的方法是什么?通过枚举斐波纳契数并在达到目标数时停止,可以很容易地在线性时间内完成此操作,但有没有比这更快的方法呢?
编辑:目前,这里发布的最佳解决方案使用O(log n)内存在O(log n)时间内运行,假设数学运算在O(1)中运行并且机器字可以在O(1)空间中保存任何数字.我很好奇是否可以降低内存要求,因为你可以使用O(1)空间计算斐波纳契数.
我正在学习Haskell,并且遇到了以下代码:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
就其工作方式而言,我在解析方面遇到了一些麻烦.它非常整洁,我知道不需要更多内容,但我想了解Haskell在写作时如何设法"填写"文件:
take 50 fibs
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
谢谢!
我想知道怎样才能找到第n个斐波那契序列的n个非常大的n值1000000.使用等级 - 学校递推方程fib(n)=fib(n-1)+fib(n-2)
,找到第50个学期需要2-3分钟!
谷歌搜索后,我开始了解Binet的公式,但它不适合n> 79的值,因为这里说的
有没有算法这样做就像我们找到素数一样?