2011-09-19 29 views
4

我想問一下如何檢索出fibo列表,然後檢查用戶的輸入值是否在fibo列表中。在Python中檢查屬於斐波納契數字的輸入

a , b = 1, 1 
while num <= sys.maxint: 
    fibo == a , b = b, a+b 
    if num == (b +a+b): 
     print "It is a Fibonacci number"   
     break 
    else: 
     print "It is not a Fibonacci number" 
     break 

謝謝!

+0

你讀過[這個問題,它的答案(http://stackoverflow.com/questions/494594/how-to-write-the-fibonacci - 序列式的Python)?難道他們不給你足夠的信息來解決你的問題嗎? – MarcoS

+0

是的,我做了..但我真的不明白... – user950472

回答

8

使用more sophisticated Fibonacci number test,你可以使用

def is_fibonacci(n): 
    phi = 0.5 + 0.5 * math.sqrt(5.0) 
    a = phi * n 
    return n == 0 or abs(round(a) - a) < 1.0/n 

(這可能是確定一個數字是否是斐波那契數的最有效的方法,它是最有可能不是預期的解決方案,你的功課。我只是包括這個答案以供將來參考)

1

可能是不是很有效的解決方案 - 使用接近公式更有效(見Sven's answer),但你可以這樣做:

def fibs(): 
    a,b = 0,1 
    yield a 
    yield b 
    while True: 
     a,b = b,a+b 
     yield b 

n = int(raw_input("please, enter a number ")) 
for fib in fibs(): 
    if n == fib: 
    print "your number is a Fibonacci number!" 
    break 
    if fib > n: 
    print "your number is not a Fibonacci number!" 
    break 

fibs發電機給你的斐波那契數列表。你可以瀏覽清單,每一個數字你都可以檢查它是否與用戶輸入的數字相同(在這種情況下,你完成了),或者它比用戶輸入的數字更大(在這種情況下,重做)。

我希望這是有用的,至少要了解Python生成器。

+1

謝謝MarcoS!它真的幫助我很多!我可以問,如果我們不使用def或yield,那麼這些代碼是否仍然有效?我嘗試過,但不是真的。 – user950472

+1

如果你不使用'yield',那麼你不會得到一個Python生成器,所以for循環不起作用。另外,你刪除'fibs'的def定義,代碼將不再起作用。所以,回答你的問題是「如果你刪除了'def'或'yield',代碼將不再起作用。」但是,你爲什麼要刪除它們? – MarcoS

+0

呃,我想嘗試其他方法。也許是這樣的: – user950472

3

一個Python的一個班輪

def is_fibonacci(n): 
    return n >= 0 and (n==0 or sqrt(5*n*n - 4).is_integer() or sqrt(5*n*n + 4).is_integer()) 
+0

我不知道爲什麼這不是upvoted!這段代碼真棒! – arsho

0
x = int(input("Enter a number: ")) 

A = [0, 1] 

for i in range(2,720): 

    A.append(A[i-1]+A[i-2]) 

bool=False 

for i in range(2,720): 

    if x==A[i]: 

     bool=True 
     break 

if bool==True: 

    print "Found,Index is:",i+1 
else: 

    print "Not Found"