有人请解释我的斐波那契搜索算法.
我已经尝试了很多资源并进行了大量搜索,但算法仍然不清楚.大多数资源都将其描述为与二进制搜索相关联,但我不理解它们.我知道斐波那契搜索算法是二进制搜索的扩展,我很清楚.
我的书也没能解释.
我知道定义为F(n)= F(n-1)+ F(n-2)的斐波纳契数,所以不需要解释.
通过添加我不理解的内容来更新问题@AnthonyLabarre说:
我正在使用的书有奇怪的符号,没有任何解释.在这里发布算法,请帮忙.
if(key == a[mid]) return mid; // understood this, comes from binary search
if(key > a[mid]) {
if(p == 1) return -1; // What is p? It comes as a function arg
mid = mid + q; //Now what's this q? Again comes a function arg
p = p - q; // Commented as p=fib(k-4)
q = q-p; // q = fib(k-5)
} else // key < a[mid] {
if(q == 0) return …Run Code Online (Sandbox Code Playgroud) 我真的想知道真正的定义.我试过看书,却无法理解.
O:Big-O符号最坏的情况.
Θ:Theta表示法的平均情况.
Ω:欧米茄符号最好的情况.
为什么维基百科代表Big-O算法的速度,包括其平均,最佳和最差情况?为什么他们没有取代那些正式的关键词?
我被要求以最有效的方式写一个fib函数?
这是我提供的实现:
public static int fib(int n)
{
int prev1 = 1, prev2 = 1, ans = 1, i = 3;
while (i <= n)
{
ans = prev1 + prev2;
prev1 = prev2;
prev2 = ans;
i++;
}
return ans;
}
Run Code Online (Sandbox Code Playgroud)
这是最有效的吗?什么是大订单?
我还被要求给出递归实现的大概念:
public static int recursiveFib(int n)
{
if (n <= 2)
return 1;
else
return recursiveFib(n-1) + recursiveFib(n - 2);
}
Run Code Online (Sandbox Code Playgroud)
我认为这个是指数2 ^ n,这就是为什么它效率低下的原因.
所以我是编程和思想世界的新手,我会拿起一本书来开始学习.我买了C#3rd Edition的玩家指南和它给你的一个小作业,让我很难过.我一步一步地调试它以帮助我理解,但程序的流程对我来说毫无意义.这里是.
static void Main(string[] args)
{
for (int index = 1; index <= 10; index++)
{
Console.WriteLine(Fibonacci(index));
}
Console.ReadKey();
}
/// <summary>
/// Returns a number from the Fibonacci sequence, starting at 1.
/// Note that this implementation is not very optimized, and can
/// take a very long time if you're looking up large numbers.
/// </summary>
/// <param name="number"></param>
/// <returns></returns>
static ulong Fibonacci(int number)
{
if (number == 1) { return 1; }
if (number == …Run Code Online (Sandbox Code Playgroud) 我创建了以下简单的Fibonacci实现:
#![feature(test)]
extern crate test;
pub fn fibonacci_recursive(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
}
}
pub fn fibonacci_imperative(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => {
let mut penultimate;
let mut last = 1;
let mut fib = 0;
for _ in 0..n {
penultimate = last;
last = fib;
fib = penultimate + last; …Run Code Online (Sandbox Code Playgroud) 我有两个函数fib1并fib2计算Fibonacci.
def fib1(n):
if n < 2:
return 1
else:
return fib1(n-1) + fib1(n-2)
def fib2(n):
def fib2h(s, c, n):
if n < 1:
return s
else:
return fib2h(c, s + c, n-1)
return fib2h(1, 1, n)
Run Code Online (Sandbox Code Playgroud)
fib2工作正常,直到它炸毁递归限制.如果理解正确,Python不会针对尾递归进行优化.我很好.
什么让我fib1开始减速甚至停止,即使非常小的值n.为什么会这样?为什么它在缓慢之前没有达到递归限制?
我正在尝试学习Big-O符号,但我很难计算递归函数的时间复杂度.
你能帮我理解下面例子的时间复杂度吗?
public int recursiveFunction(int n) {
if (n == 0) {
return 0;
}
return Math.max(recursiveFunction(rand(n)) + 2,recursiveFunction(n - 1));
}
public int rand(int n) {
return new Random().nextInt(n - 1);
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
这是我作业的一个问题.我不太清楚如何解决这样的问题.
If T(n) = nT(n - 1) and T(1) = 3, then
a) T(n) = O(n^n)
b) T(n) = ?(n!)
c) T(n) = O(2^(nlogn))
d) none of the above
我不需要这个问题的确切答案(因为它的功课),但我想知道告诉递归函数的界限的方法.
我正在尝试计算这个函数的T(n),我得出的是T(n)= T(n)+ T(n)+ O(1).我有两个递归调用函数g()的拖曳T(n),然后是所有常数时间操作(如加法)的O(1).我觉得我离开了所以任何帮助都会非常感激,我的数学背景也不太合理.
int g(int y) {
if (y <= 0) {
return 1;
}
else {
return g(y - 1) + g(y - 2);
}
}
Run Code Online (Sandbox Code Playgroud) 我必须使用Smalltalk返回第n 个斐波那契数,我以前没有使用过这种语言。该程序将1返回到任何输入,我不知道为什么。我认为它甚至没有迭代for循环。有人可以帮我吗?谢谢。
'Which fibonacci number do you want? (n>2)' printNl.
n := stdin nextLine asInteger.
(n <= 2)
ifTrue: ['Type a larger number, F(1) and F(2) equals 1!' displayNl.]
ifFalse: [
result:= 1.
parent := 1.
gparent := 1.
2 to: n do: [ :i | [
result := (parent + gparent).
gparent := parent.
parent := result.
'come on, do something' displayNl.
]
].
result displayNl.
].
Run Code Online (Sandbox Code Playgroud)