斐波那契数的总和

时间:2011-04-06 11:49:34

标签: python algorithm math fibonacci

我找到了这个任务here

  

给出第i个(1 <= i <= 35)斐波那契   数字F(i)计算总和   ith直到i + 9号   F(i)+ F(i + 1)+ ... + F(i + 9)和最后一个   i + 246个F(i + 246)的数字

我一直试图用python和一些技巧来解决这个问题(Binnet的公式和棘手的复发):

 f=lambda n:((1+5**.5)**n-(1-5**.5)**n)/(2**n*5**.5)
 exec"n=input();print int(55*f(n)+88*f(n+1)+f(n+6)%10);"*input()

但我还没有设法挤出认为给出源代码限制为111而我的是115,任何提示如何改进我的解决方案?

我是python的新手,所以我们非常感谢能够获得成功解决方案的任何帮助。

谢谢,

6 个答案:

答案 0 :(得分:5)

您是否尝试使用此总和公式?

http://en.wikipedia.org/wiki/Fibonacci_number#Second_identity(“第二身份”)?

答案 1 :(得分:2)

f = lambda n,t=5**.5:((1+t)**n-(1-t)**n)/(2**n*t)等花费8个字符,t=5**.5获得12:3批5**.5 - &gt; t。这是一个4个字符的保存,这似乎是你需要的。

[编辑纠正错字;我在分母中有2*n而不是2**n。]

你可以在Binet的公式中保存更多不同的字符:f=lambda n:round((1+5**.5)**n/5**.5/2**n)

答案 2 :(得分:1)

这是110解决方案,我不得不重写公式并使用@ Gareth的建议:

p=5**.5
f=lambda n:((1+p)**n-(1-p)**n)/(2**n*p)
exec "n=input();print int(f(n+11)-f(n+1)+f(n+6)%10);"*input()

现在保存另一个符号,109(使用n操纵并摆脱+11):

p=5**.5
f=lambda n:((1+p)**n-(1-p)**n)/(2**n*p)
exec "n=input()+6;print int(f(n+5)-f(n-5)+f(n)%10);"*input()

修改:计算特定数字的新方法,保存另外4个符号并允许避免int()

def f(n):exec"a=b=1;"+"a,b=b,a+b;"*(n-1);return a
exec "n=input()+6;print f(n+5)-f(n-5)+f(n)%10;"*input()

答案 3 :(得分:0)

抱歉,在发布之前我没有正确阅读您的问题。我很高兴你至少找到了一些用途。


我不知道Python,但在Mathematica中,尽可能通用:

f[1] = 1;
f[2] = 1;
f[x_] := f[x] = f[x - 1] + f[x - 2]

t = 0;

n = 35;

For[i = 0, i <= 9, i++, t += f[n + i]]

t += f[n + 246] ~Mod~ 10

或者,在简洁的Mathematica中,仍然没有使用Fibonacci函数:

f[1|2]=1;a:f@x_:=a=f[x-1]+f[x-2];Sum[f[#+x],{x,0,9}]+f[#+246]~Mod~10&

答案 4 :(得分:0)

p=5**.5
f=lambda n:((1+p)**n-(1-p)**n)/(2**n*p)
exec"n=input();print 55*f(n)+88*f(n+1)+f(n+6)%10;"*input()

106 chars,只要你不关心int()函数并接受一个浮点数

答案 5 :(得分:-1)

这个将斐波纳契系列打印到n。

def fib(n):    
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
        print()