f[0] = 0;
f[1] = 1;
f[x_] := f[x-1] + f[x-2]
Run Code Online (Sandbox Code Playgroud)
这个功能在Mathematica中运行缓慢,我需要提高速度.我必须使用函数式编程和递归.我不确定为什么这么慢,甚至最轻微的想法如何改善这将是有帮助的.
请你帮我看一下前10个斐波那契数字.我的代码显示以下结果:1,2,3,5,8,13,21,34,55,我需要它还显示前两个Fibonacci数字(0和1).我该怎么办?
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a As Integer = 0
Dim b As Integer = 1
Dim fib As Integer = 0
Do
fib = a + b
a = b
b = fib
Label1.Text = Label1.Text + fib.ToString & ControlChars.NewLine
Loop While fib < 55
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
在专业编程中你需要使用Fibonacci序列吗?
在博客文章中偶然发现了这个糟糕的C++代码示例,没有任何解释为什么它被认为是"坏".我有自己的想法,但我想听听有经验的C++开发人员.
unsigned int Fibonacci (unsigned int n)
{
if (n == 0 || n == 1)
return n;
else
return Fibonacci (n - 1U) + Fibonacci (n - 2U);
}
Run Code Online (Sandbox Code Playgroud) 我有一个不寻常的(我认为)问题.对于给定数量F_n(我不知道n的值),我必须找到数字F_0,F_1,使得F_ {n} = F_ {n-1} + F_ {n-2}.另外的困难是这个序列应该尽可能长(F_n的值n应该是最高的),如果存在多个解决方案,我必须用最小的F_0.总之,我必须生成我自己的"斐波那契"序列.一些例子:
in:F_n = 10; out:F_0 = 0; F_1 = 2;
in:F_n = 17; out:F_0 = 1; F_1 = 5;
in:F_n = 4181; out:F_0 = 0; F_1 = 1;
我观察到的每个序列("Fibonacci规则")F_n有:
F_n = Fib_n*F_1 + Fib_ {n-1}*F_0
其中Fib_n是第n个斐波那契数.特别是斐波纳契数列确实如此.但我不知道这种观察是否值得.我们不知道n,我们的任务是找到F_1,F_0因此我认为我们什么也没有获得.有任何想法吗?
可能重复:
在Python中处理非常大的数字
我有一个python函数来生成斐波纳契数:
def fib(n):
return ((1+math.sqrt(5))**n - (1-math.sqrt(5))**n)/(2**n*math.sqrt(5))
Run Code Online (Sandbox Code Playgroud)
我可以提供最多700的fib功能数字,它开始
OverflowError: (34, 'Numerical result out of range')
Run Code Online (Sandbox Code Playgroud)
我是否需要使用特殊类型来解决这个问题?
我正在学习并行化,在一个练习中,我给出了一些我应该提高性能的算法.其中一个是Fibonacci序列生成器:
array[0] = 0;
array[1] = 1;
for (q = 2; q < MAX; q++) {
array[q] = array[q?1] + array[q?2];
}
Run Code Online (Sandbox Code Playgroud)
我怀疑这是不能优化的(通过并行化),因为每个数字都取决于前两个数字(因此间接地取决于所有前面的数字).怎么可以并行化呢?
我有以下问题:我应该计算另一个给定数字的斐波纳契数.我知道皮萨诺时期,我想在这里实施它.这是代码:
#include <iostream>
#include <cstdlib>
long long get_fibonaccihuge(long long n, long long m) {
long long period = 0;
if (m % 2 == 0) {
if(m / 2 > 1)
period = 8 * (m / 2) + 4;
else
period = 3;
}
else{
if(((m + 1) / 2) > 1)
period = 4 * ((m + 1) / 2);
else
period = 1;
}
long long final_period = n % period;
long long array_fib[final_period];
array_fib[0] = 1; …Run Code Online (Sandbox Code Playgroud) 所以我一直插科打诨与Python有点最近,我试图找到一种方式来输出Fibonacci序列的第n个数在一个单一的表达.这是我到目前为止编写的代码:
(lambda f: f if f<2 else (f-1)+(f-2))(n)
# n == 1 -> 1
# n == 2 -> 1
# n == 3 -> 3
# n == 4 -> 5
# n == 5 -> 7
....
Run Code Online (Sandbox Code Playgroud)
但是,正如我在上面评论的那样,它只输出一组奇数.我很困惑为什么会发生这种情况,因为如果我要将其重新编写为命名的lambda函数,它看起来像这样:
f = lambda n: n if n<2 else f(f-1)+f(f-2)
# f(1) -> 1
# f(2) -> 1
# f(3) -> 2
# f(4) -> 3
...
# f(10) -> 55
...
Run Code Online (Sandbox Code Playgroud)
现在我添加Lambda Calculus标签的原因是因为我不确定这个问题是否属于简单理解Python如何处理这个问题的范畴.我读过关于演算的Y组合一点点,但是这是一个外语对我无法从我发现这个约演算推导资源什么.
现在,我想这样做的一行代码,而不是命名它的原因,是因为我想尝试,并把这个lambda函数到列表理解.所以做这样的事情:
[(lambda f: f if f<2 else …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
public class DynamicFib
{
private static Map<Integer, BigInteger> myMap = new HashMap<>();
static {
myMap.put(0, BigInteger.ZERO); //fibonacci(0)
myMap.put(1, BigInteger.ONE); //fibonacci(1)
}
public static BigInteger fibonacci(int x)
{
// System.out.println("x = [" + x + "]");
return myMap.computeIfAbsent(x, n -> fibonacci(n - 2).add(fibonacci(n - 1)));
}
public static void main(String[] args)
{
System.out.println("l = " + fibonacci(25));
System.out.println("myMap = " + myMap);
System.out.println("myMap = " + myMap.keySet().size());
}
}
Run Code Online (Sandbox Code Playgroud)
控制台输出:
l = 75025
myMap …Run Code Online (Sandbox Code Playgroud) 我为前22个词做了一个简单的斐波那契数列计算器:
i=1
n=0
while i<=20000:
i = i + n
n = i - n
print(i)
Run Code Online (Sandbox Code Playgroud)
看起来结果是正确的
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
Run Code Online (Sandbox Code Playgroud)
但我似乎无法在线上找到任何类似的代码。我认为那是一个很大的危险信号。有人可以告诉我这里有什么问题吗?这是效率低下的代码吗?