ফিবোনাচি সিকোয়েন্স কীভাবে লিখবেন?


140

আমি মূলত প্রোগ্রামটি ভুলভাবে কোড করেছিলাম। ফাইবোনাচি সংখ্যাগুলি একটি ব্যাপ্তির (যেমন স্টার্টনাম্বার 1, শেষের সংখ্যা 20 এর মধ্যে = কেবল 1 এবং 20 এর মধ্যে থাকা সংখ্যাগুলির মধ্যে) ফিরিয়ে দেওয়ার পরিবর্তে, আমি প্রোগ্রামটির জন্য সমস্ত ফিবোনাচি সংখ্যা পরিসরের মধ্যে প্রদর্শন করার জন্য লিখেছি (উদাঃ স্টার্টনम्बर 1, শেষ সংখ্যা 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))

কেউ আমার দ্বিতীয় খণ্ডে উল্লেখ করেছেন (যা নকল হওয়ার জন্য বন্ধ ছিল - /programming/504193/how-to-write-the-fibonacci-sequence-in-python-part-ii ) আমি কিছুক্ষণ লুপ ব্যবহার করে জেনারেটরের মাধ্যমে startNumber এবং endNumber পাস করতে হবে। কেউ দয়া করে আমাকে কীভাবে এটি করতে চান তার দিকে নির্দেশ করতে পারেন? কোন সাহায্য স্বাগত।


আমি একজন লার্নিং প্রোগ্রামার এবং আমি কিছুটা গোলমাল শুরু করেছি। আমাকে এমন একটি প্রোগ্রাম লিখতে বলা হয়েছে যা একজন ব্যবহারকারী ইনপুটড শুরুর নম্বর এবং শেষ সংখ্যা দ্বারা (যেমন। স্টার্টনম্বার = 20 শেষ সংখ্যা = 100 এবং এটি কেবলমাত্র এই ব্যাপ্তির মধ্যে সংখ্যাগুলি প্রদর্শন করবে) দ্বারা ফিবোনাকির সিক্যুয়েন্স গণনা এবং প্রদর্শন করবে। কৌশলটি হ'ল এটি অন্তর্নিহিতভাবে ব্যবহার করা (যা পাইথনে কীভাবে করব তা আমি জানি না? - আমি অন্তর্ভুক্ত করছি এর একটি অন্তর্ভুক্ত ব্যাপ্তি ব্যবহার করার অর্থ?)।

আমার এখন পর্যন্ত যা আছে তা প্রকৃত কোডিং নয় বরং:

  • অসীমের কাছে Fib ক্রম সূত্রটি লিখুন Write
  • প্রারম্ভের সংখ্যাটি শেষ নম্বর পর্যন্ত কেবল Fib ক্রম থেকে প্রদর্শন করুন।

কোথা থেকে শুরু করব তা সম্পর্কে আমার কোনও ধারণা নেই এবং আমি কীভাবে এটি লিখতে হয় তার জন্য ধারণা বা অন্তর্দৃষ্টি জিজ্ঞাসা করছি। আমি ফাইব সিকোয়েন্স ফোরামেলাও লেখার চেষ্টা করেছি তবে আমি সেটিও হারিয়ে ফেলছি।

উত্তর:


257

উইকিপিডিয়া এবং ওল্ফ্রামে ফিবোনাচি সিকোয়েন্স সম্পর্কে প্রচুর তথ্য রয়েছে । আপনার প্রয়োজন হতে পারে অনেক বেশি। যাইহোক আপনার কী প্রয়োজন তা খুঁজে পাওয়ার জন্য (যদি সম্ভব হয় দ্রুত) এই সংস্থানগুলি কীভাবে ব্যবহার করতে হয় তা শিখাই ভাল জিনিস।

অসীমের কাছে Fib ক্রম সূত্রটি লিখুন Write

গণিতে, এটি পুনরাবৃত্ত আকারে দেওয়া হয়:

উইকিপিডিয়া থেকে ফিবোনাচি

প্রোগ্রামিংয়ে, অসীমের অস্তিত্ব নেই। আপনি গণিত ফর্মটি সরাসরি আপনার ভাষায় অনুবাদ করে একটি পুনরাবৃত্ত ফর্ম ব্যবহার করতে পারেন, উদাহরণস্বরূপ পাইথনে এটি হয়ে যায়:

def F(n):
    if n == 0: return 0
    elif n == 1: return 1
    else: return F(n-1)+F(n-2)

আপনার পছন্দের ভাষায় এটি ব্যবহার করে দেখুন এবং দেখুন যে আকার বড় হওয়ার সাথে সাথে এই ফর্মটির জন্য অনেক বেশি সময় প্রয়োজন । আসলে এটি সময়ে (2 এন )।

আমি আপনার সাথে সংযুক্ত সাইটগুলিতে যান এবং এটি ( ওল্ফ্রামে ) দেখতে পাবেন :

ফিবোনাচি সমীকরণ

পাইথনে এটি কার্যকর করা খুব সহজ এবং খুব দ্রুত গণনা করা যায়:

from math import sqrt
def F(n):
    return ((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))

এটি করার অন্য একটি উপায় সংজ্ঞাটি অনুসরণ করছে ( উইকিপিডিয়া থেকে ):

অনুক্রমের প্রথম সংখ্যা 0, দ্বিতীয় সংখ্যা 1 এবং প্রতিটি পরবর্তী সংখ্যাটি ক্রম 0, 1, 1, 2, 3, 5, 8 উপস্থাপন করে যথাক্রমে পূর্ববর্তী দুটি সংখ্যার যোগফলের সমান ইত্যাদি

যদি আপনার ভাষা পুনরাবৃত্তিকারীদের সমর্থন করে তবে আপনি এর মতো কিছু করতে পারেন:

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

প্রারম্ভের সংখ্যাটি শেষ নম্বর পর্যন্ত কেবল Fib ক্রম থেকে প্রদর্শন করুন।

একবার আপনি কীভাবে ফিবোনাচি নম্বরগুলি জেনারেট করতে পারবেন তা জানার পরে আপনাকে কেবল সংখ্যাটি চক্র করতে হবে এবং তারা প্রদত্ত শর্তাদি যাচাই করে কিনা তা পরীক্ষা করে দেখতে হবে।

মনে করুন এখন আপনি আফ (এন) লিখেছেন যা ফিবোনাচি সিকোয়েন্সের এন-তম শব্দটি প্রদান করে (যেমন স্কয়ার্ট (5) সহ)

বেশিরভাগ ভাষায় আপনি যেমন কিছু করতে পারেন:

def SubFib(startNumber, endNumber):
    n = 0
    cur = f(n)
    while cur <= endNumber:
        if startNumber <= cur:
            print cur
        n += 1
        cur = f(n)

পাইথনে আমি পুনরুক্তি ফর্মটি ব্যবহার করতাম এবং এর জন্য যাব:

def SubFib(startNumber, endNumber):
    for cur in F():
        if cur > endNumber: return
        if cur >= startNumber:
            yield cur

for i in SubFib(10, 200):
    print i

আমার ইঙ্গিতটি আপনার যা প্রয়োজন তা পড়তে শেখা । প্রকল্পের ইউলার (এর জন্য গুগল) আপনাকে এটি করতে প্রশিক্ষণ দেবে: পি শুভকামনা এবং মজা করুন!


1
আপনাকে কিছুক্ষণ লুপ ব্যবহার করতে হবে, মানচিত্রটি নয়। এটি নিজে থেকে বের করার চেষ্টা করুন, আপনি যদি এটি না করতে পারেন তবে কোডটি নিয়ে ফিরে আসুন। আমি অলস নই (কোডটি এই মন্তব্যের চেয়ে ছোট)। আমি আপনার জন্য এটি করছি, "যখন" ইঙ্গিত দিয়ে চেষ্টা করুন) যদি আপনার সমস্যা হয় তবে আবার ফিরে আসুন;)
আন্দ্রে অম্বু

আমি ফিরে এসেছি আমি মানচিত্র (পরিসীমা) ফাংশন থেকে মুক্তি পেয়েছি এবং কেবলমাত্র একটি পরিসীমা (স্টার্টনम्बर, শেষ নম্বর) ফাংশন ব্যবহার করছি। এখন আমার সমস্যাটি হ'ল সময় বিবৃতিটি কোথায় ব্যবহার করবেন। আমি ফাংশনটির শুরুতে চেষ্টা করি তবে অবশ্যই একটি বিলিন ত্রুটিযুক্ত লাইন রয়েছে। আমি এটা কোথায় রাখা উচিত? থেক্স
এসডি

আপনার প্রোগ্রামের ইনপুট-আউটপুটের উদাহরণ (স্বল্প পরিসীমা সহ) হাতে পাওয়ার চেষ্টা করুন। আপনার প্রোগ্রামটি কোথায় ভুল তা খুঁজে বের করার চেষ্টা করুন। "বাই-হ্যান্ড মেথড" কোডে রূপান্তর করার চেষ্টা করুন। এটি ব্যায়ামের জন্য, শেখার জন্য। আমি কোডের দুটি লাইন রেখে দিতে পারি তবে আমি মনে করি না আপনি এগুলি থেকে কিছু শিখবেন।
Andrea অম্বু

1
আমাদের ব্যবহার করা উচিত int(((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))), কোন ধারণা? @ আন্ড্রেআম্বু
লর্ড 63। জে

3
@ lord63.j, আপনি শুধুমাত্র যে সূত্র ব্যবহার করা উচিত যদি তুমি সচেতন এটি প্রকৃত মূল্য থেকে বিচ্যুত যখন শুরু হয় n70 উপরে এবং আপ হাতাহাতি OverflowError যখন nহয় 600. সামান্য উপরে অন্য পন্থা একটি ব্যবস্থা করতে সক্ষম nবা একাধিক ফুঁ ছাড়া 1000 এর আপ বা নির্ভুলতা হারাতে।
সিড্লেন

66

ফিবোনাচি সিকোয়েন্সের দক্ষ পাইথোনিক জেনারেটর

এই সিক্যুয়েন্সের সংক্ষিপ্ততম পাইথোনিক প্রজন্মকে পাওয়ার চেষ্টা করার সময় আমি এই প্রশ্নটি পেয়েছি (পরে বুঝতে পেরে আমি পাইথন বর্ধনের প্রস্তাবতে একই রকম দেখতে পেয়েছি ), এবং আমার নির্দিষ্ট সমাধান নিয়ে অন্য কেউ আসছেন তা আমি লক্ষ্য করি নি (যদিও শীর্ষের উত্তরটি কাছাকাছি হলেও কম মার্জিত হয়), তাই এখানে প্রথম পুনরাবৃত্তির বর্ণনা দেওয়ার মতামত দেওয়া হয়েছে, কারণ আমি মনে করি এটি পাঠকদের বুঝতে সহায়তা করতে পারে:

def fib():
    a, b = 0, 1
    while True:            # First iteration:
        yield a            # yield 0 to start with and then
        a, b = b, a + b    # a will now be 1, and b will also be 1, (0 + 1)

এবং ব্যবহার:

for index, fibonacci_number in zip(range(10), fib()):
     print('{i:3}: {f:3}'.format(i=index, f=fibonacci_number))

কপি করে প্রিন্ট:

  0:   0
  1:   1
  2:   1
  3:   2
  4:   3
  5:   5
  6:   8
  7:  13
  8:  21
  9:  34
 10:  55

(স্বীকৃতিপ্রদান উদ্দেশ্যে, আমি সম্প্রতি একটি লক্ষ্য অনুরূপ বাস্তবায়ন মডিউল উপর পাইথন ডকুমেন্টেশনে, এমনকি ভেরিয়েবল ব্যবহার aএবং b, আমি এখন যা প্রত্যাহার এই উত্তরটি লেখার আগে দেখা হচ্ছে। কিন্তু আমি এই উত্তর ভাষা ভালো ব্যবহার প্রমান মনে হয়।)

পুনরাবৃত্তির সাথে সংজ্ঞায়িত বাস্তবায়ন

পূর্ণসংখ্যা ক্রম অনলাইন এনসাইক্লোপিডিয়া ফিবানচি সিকোয়েন্স যাও recursively সংজ্ঞায়িত হিসাবে

F (n) = F (n-1) + F (n-2) এর সাথে F (0) = 0 এবং F (1) = 1

পাইথনে এটিকে পুনরাবৃত্তভাবে সংজ্ঞায়িত করা নিম্নলিখিতভাবে করা যেতে পারে:

def rec_fib(n):
    '''inefficient recursive function as defined, returns Fibonacci number'''
    if n > 1:
        return rec_fib(n-1) + rec_fib(n-2)
    return n

তবে গাণিতিক সংজ্ঞাটির এই সঠিক প্রতিনিধিত্ব 30 এর চেয়ে বেশি সংখ্যার জন্য অবিশ্বাস্যভাবে অক্ষম, কারণ প্রতিটি সংখ্যা গণনা করা হচ্ছে তার নীচের প্রতিটি সংখ্যার জন্যও গণনা করতে হবে। নিম্নলিখিতটি ব্যবহার করে আপনি কতটা ধীর গতিতে তা প্রদর্শন করতে পারেন:

for i in range(40):
    print(i, rec_fib(i))

দক্ষতার জন্য স্মরণীয় পুনরাবৃত্তি

গতি উন্নত করার জন্য এটি স্মৃতিচারণ করা যেতে পারে (এই উদাহরণটি এই ফাংশনটি গ্রহণ করে যে একটি ডিফল্ট কীওয়ার্ড আর্গুমেন্ট একই সময়ে প্রতিটি ফাংশন বলা হয়, তবে সাধারণত আপনি ঠিক এই কারণে কোনও পরিবর্তনীয় ডিফল্ট যুক্তি ব্যবহার করবেন না):

def mem_fib(n, _cache={}):
    '''efficiently memoized recursive function, returns a Fibonacci number'''
    if n in _cache:
        return _cache[n]
    elif n > 1:
        return _cache.setdefault(n, mem_fib(n-1) + mem_fib(n-2))
    return n

আপনি দেখতে পাবেন মেমোজাইজড সংস্করণটি আরও দ্রুত এবং কফির জন্য উঠে পড়ার চিন্তাভাবনা করার আগে দ্রুত আপনার সর্বাধিক পুনরাবৃত্তির গভীরতা ছাড়িয়ে যাবে। এটি দেখতে আপনি দেখতে পারবেন যে এটি দৃশ্যমানভাবে কতটা দ্রুত:

for i in range(40):
    print(i, mem_fib(i))

(মনে হচ্ছে আমরা কেবল নীচের কাজটি করতে পারি, তবে এটি আসলে আমাদের ক্যাশে সুবিধা নিতে দেয় না, কারণ সেটডিফল্ট বলার আগে এটি নিজেকে কল করে))

def mem_fib(n, _cache={}):
    '''don't do this'''
    if n > 1:  
        return _cache.setdefault(n, mem_fib(n-1) + mem_fib(n-2))
    return n

পুনরাবৃত্তভাবে সংজ্ঞায়িত জেনারেটর:

যেহেতু আমি হাস্কেল শিখছি, আমি হাসকেলে এই বাস্তবায়নটি দেখতে পেয়েছি:

fib@(0:tfib) = 0:1: zipWith (+) fib tfib

এই মুহুর্তে পাইথনে আমি এর নিকটতম স্থানটি পেতে পারি বলে মনে করি:

from itertools import tee

def fib():
    yield 0
    yield 1
    # tee required, else with two fib()'s algorithm becomes quadratic
    f, tf = tee(fib()) 
    next(tf)
    for a, b in zip(f, tf):
        yield a + b

এটি এটি দেখায়:

[f for _, f in zip(range(999), fib())]

যদিও এটি কেবল পুনরাবৃত্তি সীমাতে যেতে পারে। সাধারণত, 1000, যেখানে হাস্কেল সংস্করণটি 100 লক্ষ লক্ষ পর্যন্ত যেতে পারে, যদিও এটি করতে আমার ল্যাপটপের সমস্ত 8 জিবি মেমরি ব্যবহার করে:

> length $ take 100000000 fib 
100000000

নবম ফিবোনাচি নম্বর পেতে পুনরাবৃত্তি গ্রহণ করা

একজন মন্তব্যকারী জিজ্ঞাসা করেছেন:

পুনরাবৃত্তির উপর ভিত্তি করে ফাইব () ফাংশনের জন্য প্রশ্ন: আপনি যদি নবম পেতে চান, উদাহরণস্বরূপ দশম ফাইব সংখ্যা?

ইটারটুলস ডকুমেন্টেশনের এটির জন্য একটি রেসিপি রয়েছে:

from itertools import islice

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(islice(iterable, n, None), default)

এবং এখন:

>>> nth(fib(), 10)
55

সর্বশেষ '' '' এটি করবেন না '' "বিকল্পের বিষয়ে, সেটেটফল্টের আগে কেন এটি নিজেকে কল করবে তা আমি বুঝতে পারি না। N বৈধ কী হলে সেটডেফল্টের মানটি ফেরত দেওয়ার কথা নয়? ডক বলছেন "যদি কী অভিধানে থাকে তবে এর মানটি ফিরিয়ে দিন। আমি কী মিস করছি?
বিনিতব

@ বিনিথব setdefaultকলের অভ্যন্তরে প্রকাশের আগে মূল্যায়ন করা setdefaultহয়।
অ্যারন হল


21

ফিবোনাচি অনুক্রমের পিছনে ধারণাটি নীচের পাইথন কোডে দেখানো হয়েছে:

def fib(n):
   if n == 1:
      return 1
   elif n == 0:   
      return 0            
   else:                      
      return fib(n-1) + fib(n-2)         

এর অর্থ হ'ল ফাইব একটি ফাংশন যা তিনটি জিনিসের মধ্যে একটি করতে পারে। এটি fib (1) == 1, fib (0) == 0, এবং fib (n) হতে হবে:

fib (n-1) + fib (n-2)

যেখানে এন হল একটি স্বেচ্ছাসেবী পূর্ণসংখ্যা। এর অর্থ এই যে fib (2) উদাহরণস্বরূপ, নিম্নলিখিত গাণিতিকে প্রসারিত:

fib(2) = fib(1) + fib(0)
fib(1) = 1
fib(0) = 0
# Therefore by substitution:
fib(2) = 1 + 0
fib(2) = 1

নীচে প্রদর্শিত পাটিগণিতের সাথে আমরা ফাইব (3) একইভাবে গণনা করতে পারি:

fib(3) = fib(2) + fib(1)
fib(2) = fib(1) + fib(0)
fib(2) = 1
fib(1) = 1
fib(0) = 0
# Therefore by substitution:
fib(3) = 1 + 1 + 0

এখানে উপলব্ধি করার জন্য গুরুত্বপূর্ণ বিষয়টি হ'ল ফাইব (3) টি ফাইব (2) গণনা করা ছাড়া গণনা করা যায় না, যা ফাইব (1) এবং ফাইব (0) এর সংজ্ঞা জেনে গণনা করা হয়। ফাইবোনাকি ফাংশন যেমন ফাংশন কল করা হয় তাকে পুনরাবৃত্তি বলা হয়, এবং এটি প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ বিষয়।

এটি হোমওয়ার্ক অ্যাসাইনমেন্টের মতো মনে হচ্ছে তাই আমি আপনার জন্য প্রারম্ভিক / শেষ অংশটি করব না। পাইথন যদিও এটির জন্য একটি দুর্দান্তভাবে অভিব্যক্তিপূর্ণ ভাষা, সুতরাং আপনি যদি গণিতটি বোঝেন তবে এটি অবশ্যই বোঝা উচিত এবং আশা করি আপনাকে পুনরাবৃত্তির বিষয়ে শিখিয়ে দেবেন। শুভকামনা!

সম্পাদনা: আমার কোডের একটি সম্ভাব্য সমালোচনা হ'ল এটি সুপার-হ্যান্ডি পাইথন ফাংশন ফলন ব্যবহার করে না, যা ফাইব (এন) ফাংশনটিকে অনেক খাটো করে তোলে। আমার উদাহরণটি যদিও খানিকটা জেনেরিক তবে পাইথনের বাইরের অনেকগুলি ভাষা আসলে ফলন লাভ করে নি।


এটি কোনও হোম ওয়ার্কের সমস্যা নয় তবে উত্তরের জন্য আপনাকে ধন্যবাদ! আমি যা করতে হবে তা বুঝতে পেরেছি তবে এটি শুরু করে এবং বাস্তবায়ন করা যা আমি এখন আটকে রয়েছি (বিশেষত ব্যবহারকারীর ইনপুট মানগুলি প্রয়োগ করে)। আপনি কি এই সম্পর্কে কিছু অন্তর্দৃষ্টি দিতে পারেন? আমি 0x0141FAF0> ত্রুটিতে <ফাংশন ফাইব পেতে থাকি।
এসডি

আমি বুঝতে পারি যে আপনি এমন একটি প্রোগ্রাম বাস্তবায়নের জন্য খুব চেষ্টা করছেন যা আপনার বর্তমান ক্ষমতার বাইরে। আমাকে আরও কোড লিখতে সাহায্য করবে না। আপনার কোডটি কাজ না হওয়া অবধি আপনার চারপাশে হ্যাক করার চেষ্টা করা উচিত এবং আরও পাইথন টিউটোরিয়াল পড়া উচিত। হোয়াইটস্পেসে সমস্যা হতে পারে তবে আমি ত্রুটিটি জানি না।
জেমস থম্পসন

আমি বুঝেছি. অন্য কোনও ধারণা আছে যা আপনি ভাবেন যে আমি অনুপস্থিত হতে পারি? আমি বুঝতে পারছি আপনি যদি সাহায্য করতে না পারেন তবে। আমি আপনার সময় জন্য আপনাকে ধন্যবাদ।
এসডি

আপনার <ফাংশন ফাইব 0x0141FAF0> এ ত্রুটিটি "ফাইব" (যা ফাংশনটি নিজেই বোঝায়) বলার ফল হতে পারে "ফাইব ()" এর পরিবর্তে ফাংশনটিকে কল করবে। ভাগ্য সুপ্রসন্ন হোক.
কিভ

8
মনে রাখবেন যে ফিবোনাচি সংখ্যা গণনা করার এই নিষ্পাপ পুনরাবৃত্তিমূলক পদ্ধতিটি সত্যিকারের দ্রুত স্ট্যাক ওভারফ্লোতে (সাইট নয়) intoুকতে পারে। ব্যবহারিক উদ্দেশ্যে, পুনরাবৃত্তভাবে উত্পন্ন করুন বা কোনও ধরণের স্মৃতি বা কিছু ব্যবহার করুন।
ডেভিড থর্নলি

12

সময়ের জটিলতা:

ক্যাচিং বৈশিষ্ট্যটি ফিবোনাচি সিরিজের পুনরাবৃত্ত গাছের পুনরাবৃত্তিগুলি সরিয়ে ফিবোনাচি সিরিজটিকে ও (2 ^ n) থেকে ও (এন) পর্যন্ত গণনা করার স্বাভাবিক পদ্ধতিটিকে হ্রাস করে :

এখানে চিত্র বর্ণনা লিখুন

কোড:

import sys

table = [0]*1000

def FastFib(n):
    if n<=1:
        return n
    else:
        if(table[n-1]==0):
            table[n-1] = FastFib(n-1)
        if(table[n-2]==0):
            table[n-2] = FastFib(n-2)
        table[n] = table[n-1] + table[n-2]
        return table[n]

def main():
    print('Enter a number : ')
    num = int(sys.stdin.readline())
    print(FastFib(num))

if __name__=='__main__':
    main()

9

ও (লগ এন) বেসিক গাণিতিক ক্রিয়াকলাপগুলি ব্যবহার করে এটি বেশ দক্ষ।

def fib(n):
    return pow(2 << n, n + 1, (4 << 2*n) - (2 << n) - 1) % (2 << n)

এটি এক (1) বেসিক গাণিতিক ক্রিয়াকলাপগুলি ব্যবহার করে তবে মধ্যবর্তী ফলাফলগুলির আকার বড় এবং তাই মোটেও কার্যকর নয়।

def fib(n):
    return (4 << n*(3+n)) // ((4 << 2*n) - (2 << n) - 1) & ((2 << n) - 1)

স্কোয়ারিংয়ের মাধ্যমে এক্সপেনসেন্টেশন ব্যবহার করে এটি একটি বহুভিত্তিক রিং জেড [এক্স] / (এক্স ^ 2 - এক্স - 1) এর এক্স comp n গণনা করে। সেই গণনার ফলাফল হ'ল বহুমুখী ফিব (এন) এক্স + ফিব (এন -1), যেখান থেকে নবম ফিবোনাকির সংখ্যাটি পড়তে পারে।

আবার এটি ও (লগ এন) গাণিতিক ক্রিয়াকলাপগুলি ব্যবহার করে এবং খুব দক্ষ।

def mul(a, b):
        return a[0]*b[1]+a[1]*b[0]+a[0]*b[0], a[0]*b[0]+a[1]*b[1]

def fib(n):
        x, r = (1, 0), (0, 1)
        while n:
                if n & 1: r = mul(r, x)
                x = mul(x, x)
                n >>= 1
        return r[0]

1
প্রথম এবং তৃতীয় কৌশলগুলি ভাল। দ্বিতীয় কৌশলটি বন্ধ 1; এটি কার্যকরভাবে n -= 1সঠিকভাবে কাজ করা প্রয়োজন, এবং এটি কাজ করে না n = 0। যাইহোক, এগুলি কীভাবে কাজ করে, বিশেষত প্রথম কৌশলটি ব্যাখ্যা করার জন্য যদি প্রচুর প্রসঙ্গ যুক্ত করা হয় তবে এটি সত্যই আমাকে সহায়তা করবে। আমি দেখতে পাওলহঙ্কিন
একুম্যানাস

6

ফিবোনাচি সিকোয়েন্স প্রিন্ট করতে ক্যানোনিকাল পাইথন কোড:

a,b=1,1
while True:
  print a,
  a,b=b,a+b       # Could also use b=a+b;a=b-a

সমস্যার জন্য "প্রথম সংখ্যাটি 1000 অঙ্কের বেশি দীর্ঘ মুদ্রণ করুন":

a,b=1,1
i=1
while len(str(a))<=1000:
  i=i+1
  a,b=b,a+b

print i,len(str(a)),a

4

আমরা জানি যে

এখানে চিত্র বর্ণনা লিখুন

এবং যে ম্যাট্রিক্সের N-th শক্তি আমাদের দেয়:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং আমরা এমন একটি ফাংশন বাস্তবায়ন করতে পারি যা ম্যাট্রিক্সের শক্তিকে কেবল এন-থ -1 পাওয়ার সাথে গণনা করে।

যেহেতু আমরা সকলেই জানি শক্তি a ^ n এর সমান

এখানে চিত্র বর্ণনা লিখুন

সুতরাং শেষে ফিবোনাচি ফাংশনটি হ'ল (এন) ... এটি একটি সহজ বাস্তবায়নের চেয়ে সত্যিই আলাদা কিছু নয় যদি এটি সত্য যে আমরা এটিও জানি না এবং এটির x^n * x^n = x^2nমূল্যায়ন x^nজটিলতার সাথে করা যেতে পারে O (লগ এন) )

সুইফ্ট প্রোগ্রামিং ভাষা ব্যবহার করে এখানে আমার ফিবোনাচি প্রয়োগ করা হচ্ছে:

struct Mat {
    var m00: Int
    var m01: Int
    var m10: Int
    var m11: Int
}

func pow(m: Mat, n: Int) -> Mat {
    guard n > 1 else { return m }
    let temp = pow(m: m, n: n/2)

    var result = matMultiply(a: temp, b: temp)
    if n%2 != 0 {
        result = matMultiply(a: result, b: Mat(m00: 1, m01: 1, m10: 1, m11: 0))
    }
    return result
}

func matMultiply(a: Mat, b: Mat) -> Mat {
    let m00 = a.m00 * b.m00 + a.m01 * b.m10
    let m01 = a.m00 * b.m01 + a.m01 * b.m11
    let m10 = a.m10 * b.m00 + a.m11 * b.m10
    let m11 = a.m10 * b.m01 + a.m11 * b.m11

    return Mat(m00: m00, m01: m01, m10: m10, m11: m11)
}

func fibonacciFast(n: Int) -> Int {

    guard n > 0 else { return 0 }
    let m = Mat(m00: 1, m01: 1, m10: 1, m11: 0)

    return pow(m: m, n: n-1).m00
}

এটিতে জটিলতা হে (লগ এন) রয়েছে। আমরা Q এর opp কে घाস্টকারী n-1 এর সাথে গণনা করি এবং তারপরে আমরা m00 এলিমেন্টটি নিয়ে যাই যা Fn + 1 হয় যে পাওয়ার এক্সপোশনারে n-1 হ'ল আমরা চেয়েছি এন-থাই ফিবোনাচি নম্বর।

একবার আপনার কাছে দ্রুত ফাইবোনাকি ফাংশন হয়ে গেলে আপনি আগ্রহী ফিবোনাচি ক্রমের অংশটি পেতে আপনি শুরু নম্বর এবং শেষ নম্বর থেকে পুনরাবৃত্তি করতে পারেন।

let sequence = (start...end).map(fibonacciFast)

অবশ্যই তারা প্রথমে বৈধ ব্যাপ্তি তৈরি করতে পারে তা নিশ্চিত করার জন্য প্রথমে শুরু এবং শেষের দিকে কিছু পরীক্ষা করুন।

আমি জানি প্রশ্নটি 8 বছরের পুরানো, তবে যাইহোক উত্তর দেওয়ার জন্য আমি মজা পেয়েছি। :)


3

ফিবানচি ক্রম: 1, 1, 2, 3, 5, 8, ...

অর্থাৎ f(1) = 1, f(2) = 1, f(3) = 2, ..., f(n) = f(n-1) + f(n-2)

আমার প্রিয় বাস্তবায়ন (অন্যান্য বাস্তবায়নের তুলনায় সবচেয়ে সহজ এবং এখনও একটি হালকা গতি অর্জন করে) এটি হ'ল:

def fibonacci(n):
    a, b = 0, 1
    for _ in range(1, n):
        a, b = b, a + b
    return b

পরীক্ষা

>>> [fibonacci(i) for i in range(1, 10)]
[1, 1, 2, 3, 5, 8, 13, 21, 34]

টাইমিং

>>> %%time
>>> fibonacci(100**3)
CPU times: user 9.65 s, sys: 9.44 ms, total: 9.66 s
Wall time: 9.66 s

সম্পাদনা করুন: এই বাস্তবায়নের জন্য একটি উদাহরণ ভিজুয়ালাইজেশন


3

পুনরাবৃত্তি ব্যবহার করুন:

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
x=input('which fibonnaci do you want?')
print fib(x)

2

এটি করার আরেকটি উপায়:

a,n=[0,1],10
map(lambda i: reduce(lambda x,y: a.append(x+y),a[-2:]),range(n-2))

'ক' এ তালিকা অর্পণ করা, 'এন' মানচিত্রে পূর্ণসংখ্যাকে নির্ধারণ করা এবং হ্রাস করা পাইথনের তিনটি শক্তিশালী ফাংশনগুলির মধ্যে 2। এখানে মানচিত্রটি 'n-2' বারে পুনরাবৃত্তি করতে ব্যবহৃত হয়। একটি [-2:] একটি অ্যারের শেষ দুটি উপাদান পাবে। a.append (x + y) শেষ দুটি উপাদান যুক্ত করবে এবং অ্যারেতে যুক্ত হবে


1

এগুলি হওয়া দরকারের চেয়ে কিছুটা জটিল দেখায়। আমার কোডটি খুব সহজ এবং দ্রুত:

def fibonacci(x):

    List = []
    f = 1
    List.append(f)
    List.append(f) #because the fibonacci sequence has two 1's at first
    while f<=x:
        f = List[-1] + List[-2]   #says that f = the sum of the last two f's in the series
        List.append(f)
    else:
        List.remove(List[-1])  #because the code lists the fibonacci number one past x. Not necessary, but defines the code better
        for i in range(0, len(List)):
        print List[i]  #prints it in series form instead of list form. Also not necessary

2
ডায়নামিক প্রোগ্রামিং এফটিডব্লিউ! ফিবোনাচি (10000000000000000000000000000000000000000000000000000000000000000000000000000000000) প্রায় তাত্ক্ষণিক প্রতিক্রিয়া জানায়
হ্যান্স

6
একরকম আমি সন্দেহ করি।
লানারু

অন্যটির পরে মুছে ফেলা কমান্ড এড়ানোর জন্য [0, 1] (যেমন তালিকা.পেন্ড (0); তালিকা.অ্যাপেন্ড (1)) হিসাবে তালিকা শুরু করার বিষয়ে কী? ... এবং ফিবোনাচি নম্বরটি আরও ভাল সূচী করা উচিত কারণ ফিবোনাচি (10) 10-তম সংখ্যার চেয়ে নয়, 10 এর নীচে ফাইবোনাকি সংখ্যাগুলি প্রদান করে।
SEF

1

ঠিক আছে .. সমস্ত দীর্ঘ উত্তর উল্লেখ করে ক্লান্ত হয়ে পরে, এখন পাইথনে ফিবোনাকিকে বাস্তবায়নের জন্য নীচের বাছাই করুন এবং মিষ্টি, বেশ সোজা উপায় find আপনি এটি আর্গুমেন্ট পেয়ে বা ব্যবহারকারীর ইনপুট পেয়ে আপনি যেভাবে চান সেটি বাড়িয়ে তুলতে পারেন… বা সীমা 10000 থেকে পরিবর্তন করুন। আপনার যেমন প্রয়োজন তেমন ……

def fibonacci():
    start = 0 
    i = 1 
    lt = []
    lt.append(start)
    while start < 10000:
        start += i
        lt.append(start)
        i = sum(lt[-2:])
        lt.append(i)
    print "The Fibonaccii series: ", lt

এই পদ্ধতির এছাড়াও ভাল সঞ্চালন। নীচে রান অ্যানালিটিকাগুলি সন্ধান করুন

In [10]: %timeit fibonacci
10000000 loops, best of 3: 26.3 ns per loop

1

ম্যাথো হেনরির উত্তরের এটি একটি উন্নতি:

def fib(n):
    a = 0
    b = 1
    for i in range(1,n+1):
            c = a + b
            print b
            a = b
            b = c

কোডটি মুদ্রণের পরিবর্তে বি মুদ্রণ করা উচিত

আউটপুট: 1,1,2,3,5 ...


1

লুপের জন্য ব্যবহার করা এবং কেবল ফলাফল মুদ্রণ করা

def fib(n:'upto n number')->int:
    if n==0:
        return 0
    elif n==1:
        return 1
    a=0
    b=1
    for i in range(0,n-1):
        b=a+b
        a=b-a
    return b

ফলাফল

>>>fib(50)
12586269025
>>>>
>>> fib(100)
354224848179261915075
>>> 

listসমস্ত সংখ্যা সমন্বিত মুদ্রণ করুন

def fib(n:'upto n number')->int:
    l=[0,1]
    if n==0:
        return l[0]
    elif n==1:
        return l
    a=0
    b=1
    for i in range(0,n-1):
        b=a+b
        a=b-a
        l.append(b)
    return l

ফলাফল

>>> fib(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

1
import time
start_time = time.time()



#recursive solution
def fib(x, y, upperLimit):
    return [x] + fib(y, (x+y), upperLimit) if x < upperLimit else [x]

#To test :

print(fib(0,1,40000000000000))
print("run time: " + str(time.time() - start_time))

ফলাফল

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368 , 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 33935, 194335 , 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 25047301915, 40527335

রান সময়: 0.04298138618469238


1

এটি উপলব্ধি করার একটি খুব সহজ পদ্ধতি আছে!

আপনি http://www.learnpython.org/ ব্যবহার করে অবাধে এই কোডটি চালাতে পারেন

# Set the variable brian on line 3!

def fib(n):
"""This is documentation string for function. It'll be available by fib.__doc__()
Return a list containing the Fibonacci series up to n."""
result = []
a = 0
b = 1
while a < n:
    result.append(a)  # 0 1 1 2 3 5  8  (13) break
    tmp_var = b       # 1 1 2 3 5 8  13
    b = a + b         # 1 2 3 5 8 13 21
    a = tmp_var       # 1 1 2 3 5 8  13
    # print(a)
return result

print(fib(10))
# result should be this: [0, 1, 1, 2, 3, 5, 8]

কোনও জটিল পুনরাবৃত্তি ডেটা কাঠামো ছাড়াই কেবল পুনরুক্তি ব্যবহার করে ফিবোনাচি সিরিজ উপলব্ধি করার একটি সহজ উপায়!
xgqfrms

1

এটি নিম্নলিখিত উপায়ে করা যেতে পারে।

n = 0

সংখ্যা = [0]

আমার সীমার জন্য (0,11):
    প্রিন্ট এন,
    numbers.append (ঢ)
    পূর্ব = সংখ্যা [-2]
    যদি এন == 0:
        n = 1
    অন্য:
        n = n + prev

1

কেবল মজাদার জন্য পাইথন ৩.৮++ আপনি একটি তালিকা বোঝার ক্ষেত্রে একটি অ্যাসাইনমেন্ট এক্সপ্রেশন (ওরফে ওয়ালরাস অপারেটর) ব্যবহার করতে পারেন , যেমন:

>>> a, b = 0, 1
>>> [a, b] + [b := a + (a := b) for _ in range(8)]  # first 10 Fibonacci numbers
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

একটি অ্যাসাইনমেন্ট এক্সপ্রেশন আপনাকে একটি ভেরিয়েবলের জন্য একটি মান নির্ধারণ করতে এবং একই অভিব্যক্তিতে এটি ফিরিয়ে দিতে দেয়। সুতরাং, প্রকাশ

b := a + (a := b)

মৃত্যুদন্ড কার্যকর করার সমতুল্য

a, b = b, a + b

এবং মান ফিরে b


0

পাইথন শিখার সময় আমি যে টিউটোরিয়ালটি ব্যবহার করেছি তার 15 মিনিটের মধ্যে এটি পাঠককে এমন একটি প্রোগ্রাম লিখতে বলেছিল যা 3 ইনপুট সংখ্যা (প্রথম ফিবোনাচি নম্বর, দ্বিতীয় সংখ্যা এবং অনুক্রমটি বন্ধ করার জন্য নম্বর) থেকে একটি ফিবোনাকির ক্রম গণনা করবে। টিউটোরিয়ালটিতে কেবল / তারপরে ভেরিয়েবলগুলি আবৃত করা হয়েছিল এবং সেই বিন্দুতে লুপ হবে। এখনও কোন কার্য। আমি নিম্নলিখিত কোডটি নিয়ে এসেছি:

sum = 0
endingnumber = 1                

print "\n.:Fibonacci sequence:.\n"

firstnumber = input("Enter the first number: ")
secondnumber = input("Enter the second number: ")
endingnumber = input("Enter the number to stop at: ")

if secondnumber < firstnumber:

    print "\nSecond number must be bigger than the first number!!!\n"

else:

while sum <= endingnumber:

    print firstnumber

    if secondnumber > endingnumber:

        break

    else:

        print secondnumber
        sum = firstnumber + secondnumber
        firstnumber = sum
        secondnumber = secondnumber + sum

আপনি দেখতে পাচ্ছেন যে এটি সত্যিই অদক্ষ, তবে এটি কাজ করে।


0
def fib():
    a,b = 1,1
    num=eval(input("Please input what Fib number you want to be calculated: "))
    num_int=int(num-2)
    for i in range (num_int):
        a,b=b,a+b
    print(b)

3
eval(input())এখানে প্রয়োজন হয় না; আমি মনে করি int(input())ক্ষেত্রে ভাল হয়।
জিঞ্জারপ্লাস প্লাস

0

কেবলমাত্র http://projecteuler.net/problem=2 এর মধ্য দিয়ে যাচ্ছি এটি এটি ছিল আমার

# Even Fibonacci numbers
# Problem 2

def get_fibonacci(size):
    numbers = [1,2]
    while size > len(numbers):
        next_fibonacci = numbers[-1]+numbers[-2]
        numbers.append(next_fibonacci)

    print numbers

get_fibonacci(20)

0
def fib(x, y, n):
    if n < 1: 
        return x, y, n
    else: 
        return fib(y, x + y, n - 1)

print fib(0, 1, 4)
(3, 5, 0)

#
def fib(x, y, n):
    if n > 1:
        for item in fib(y, x + y, n - 1):
            yield item
    yield x, y, n

f = fib(0, 1, 12)
f.next()
(89, 144, 1)
f.next()[0]
55

0

সম্ভবত এটি সাহায্য করবে

def fibo(n):
    result = []
    a, b = 0, 1
    while b < n:
            result.append(b)
            a, b = b, b + a
    return result

0

ক্লাসিক ফিবোনাচি সিকোয়েন্সের ভিত্তিতে এবং কেবল ওয়ান-লাইনারদের জন্য

আপনার যদি কেবল সূচকের সংখ্যার প্রয়োজন হয় তবে আপনি হ্রাসটি ব্যবহার করতে পারেন ( এটি হ্রাস করার জন্য এটি সর্বোত্তমভাবে উপযুক্ত না হলেও এটি একটি ভাল অনুশীলন হতে পারে)

def fibonacci(index):
    return reduce(lambda r,v: r.append(r[-1]+r[-2]) or (r.pop(0) and 0) or r , xrange(index), [0, 1])[1]

এবং সম্পূর্ণ অ্যারে পেতে কেবল বা (r.pop (0) এবং 0) মুছে ফেলুন

reduce(lambda r,v: r.append(r[-1]+r[-2]) or r , xrange(last_index), [0, 1])

0

এটা কেমন? আমি অনুমান করি যে এটি অন্যান্য পরামর্শগুলির মতো অভিনব নয় কারণ এটি প্রত্যাশিত আউটপুট উত্পাদনের জন্য পূর্ববর্তী ফলাফলের প্রাথমিক স্পেসিফিকেশন দাবি করে, তবে আমার মনে হয় এটি একটি খুব পঠনযোগ্য বিকল্প, অর্থাত্, এটি ফলাফলটি প্রদান করে এবং পূর্ববর্তী ফলাফলটি প্রদান করে পুনরাবৃত্তি।

#count the number of recursions
num_rec = 0

def fibonacci(num, prev, num_rec, cycles):

    num_rec = num_rec + 1

    if num == 0 and prev == 0:
        result  = 0;
        num = 1;
    else:
        result = num + prev

    print(result)

    if num_rec == cycles:
        print("done")
    else:
        fibonacci(result, num, num_rec, cycles)

#Run the fibonacci function 10 times
fibonacci(0, 0, num_rec, 10)

এখানে ফলাফল:

0
1
1
2
3
5
8
13
21
34
done


0
def fib(lowerbound, upperbound):
    x = 0
    y = 1
    while x <= upperbound:
        if (x >= lowerbound):
            yield x
        x, y = y, x + y

startNumber = 10
endNumber = 100
for fib_sequence in fib(startNumber, endNumber):
    print "And the next number is... %d!" % fib_sequence

0

ফিমোনাচি সিকোয়েন্সের জন্য মেমোয়েজেশন কীভাবে কাজ করে তার আরও বিশদ বিবরণ।

# Fibonacci sequence Memoization

fib_cache = {0:0, 1:1}

def fibonacci(n):
    if n < 0:
        return -1
    if fib_cache.has_key(n):
        print "Fibonacci sequence for %d = %d cached" % (n, fib_cache[n])
        return fib_cache[n]
    else:
        fib_cache[n] = fibonacci(n - 1) + fibonacci(n - 2)
    return fib_cache[n]

if __name__ == "__main__":
    print fibonacci(6)
    print fib_cache
    # fibonacci(7) reuses fibonacci(6) and fibonacci(5)
    print fibonacci(7)
    print fib_cache

0

এই সমস্যাটি সমাধান করার জন্য আমি একটি পুনরাবৃত্ত ফাংশন এড়ানোর চেষ্টা করছিলাম, তাই আমি একটি পুনরাবৃত্তি পদ্ধতির গ্রহণ করেছি। আমি মূলত একটি স্মৃতিযুক্ত রিকার্সিভ ফাংশন করছিলাম তবে সর্বাধিক পুনরাবৃত্তির গভীরতায় মারতে থাকি। আমার কঠোর মেমরির লক্ষ্যও ছিল তাই আপনি দেখতে পাবে যে লুপিং প্রক্রিয়া চলাকালীন আমাকে অ্যারে যতটা ছোট রাখতে পারে কেবলমাত্র কোনও সময়ে ২-৩ টি মান রেখে যায়।

def fib(n):
    fibs = [1, 1] # my starting array
    for f in range(2, n):
        fibs.append(fibs[-1] + fibs[-2]) # appending the new fib number
        del fibs[0] # removing the oldest number
    return fibs[-1] # returning the newest fib

print(fib(6000000))

আমার মেশিনে 6 মিলিয়নতম ফাইবোনাকি নম্বর পেতে প্রায় 282 সেকেন্ড সময় লাগে যখন 600k ফিবোনাচি কেবল ২.৮ সেকেন্ড সময় নেয়। আমি একটি পুনরাবৃত্ত ক্রিয়াকলাপ এমনকি একটি স্মৃতিযুক্ত একটি নম্বর সহ এত বড় ফাইবোনাকির নম্বর পেতে অক্ষম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.