পুনরাবৃত্তির কাজ হিসাবে 2 ** এন - 1 কীভাবে লিখবেন?


49

আমার এমন একটি ফাংশন দরকার যা n নেয় এবং 2 এন - 1 প্রদান করে । এটি যথেষ্ট সহজ শোনায় তবে ফাংশনটি পুনরাবৃত্ত হতে হবে। এখনও পর্যন্ত আমার কাছে মাত্র 2 এন :

def required_steps(n):
    if n == 0:
        return 1
    return 2 * req_steps(n-1)

অনুশীলনটি বলে: "আপনি ধরে নিতে পারেন যে প্যারামিটার এন সর্বদা একটি ধনাত্মক পূর্ণসংখ্যার এবং 0 এর চেয়ে বড় হয়"


4
কেবল রেকর্ডের জন্য, একটি শিফট এবং বিয়োগফলের মতো একজন সাধারণ ব্যক্তির মতো এটি করার জন্য এটি আরও বেশি দক্ষ হওয়া উচিত। পাইথন ইন্টিজারগুলি নির্বিচারে প্রস্থের ফলে 1 << nপ্রবহমান হতে পারে না। এটি (1<<n) - 1একাধিক পদক্ষেপে পচে যাওয়ার উপায় আবিষ্কার করার জন্য অনুশীলন বলে মনে হচ্ছে , সম্ভবত প্রতিটি বিট একসাথে কিছু উত্তর শোয়ের মতো সেট করা।
পিটার

8
def fn(n): if n == 0: return 1; return (2 << n) - fn(0); # technically recursive
মুজবয়েস

3
@ ভু: কার্ল নয়, তবে দয়া করে আমাকে যা কিছু আছে তার তালিকা দিনC:\MyFolder
ফ্ল্যাটার

1
@ ভু: নির্ভরতা বা না এমন অনুশীলনের জন্য অপ্রাসঙ্গিক যা বিশুদ্ধরূপে পুনরাবৃত্তি ধারণাটি শেখাতে ফোকাস করে। আমি ক্লাস / পদ্ধতিগুলির একটি বেসিক উপহাস সেট তৈরি করতে পারি যা শিক্ষার্থীরা ব্যবহার করতে পারে। আপনি এমন কিছুতে মনোনিবেশ করছেন যা সম্পূর্ণরূপে অনুশীলনের পয়েন্ট ছাড়াও। ফাইল সিস্টেম নেভিগেশন ব্যবহার করা একটি ভাল উদাহরণ কারণ শিক্ষার্থীরা সাধারণত ফোল্ডার এবং ফাইলগুলির অন্তর্নিহিত পুনরাবৃত্ত প্রকৃতি বুঝতে পারে (অর্থাত ফোল্ডারগুলি একে অপরের নিকটে অনির্দিষ্ট সময়ের জন্য
বাসা বাঁধতে

1
@ ভু না আমি বলছি যে আপনি পুনরাবৃত্তির উপাত্তের কাঠামো দেখিয়ে পুনরাবৃত্তি শেখাতে পারেন। আপনি কেন এটাকে আঁকড়ে ধরছেন এ সম্পর্কে আমার ধারণা নেই।
উত্তেজনাকরিত

উত্তর:


54

2**n -1এটি 1 + 2 + 4 + ... + 2 এন-1 যা একক পুনরাবৃত্ত ফাংশন তৈরি করতে পারে (দ্বিতীয়টি 2 এর শক্তি থেকে 1 বিয়োগ করে না)।

ইঙ্গিত : 1 + 2 * (1 + 2 * (...))

নীচের সমাধান করুন, আপনি যদি ইঙ্গিতটি প্রথমে চেষ্টা করতে চান তবে দেখুন না।


এটি কাজ করে যদি nশূন্যের চেয়ে বড় হওয়ার গ্যারান্টি দেওয়া হয় (যেমন সমস্যার বিবৃতিতে প্রতিশ্রুতি দেওয়া হয়েছিল):

def required_steps(n):
    if n == 1: # changed because we need one less going down
        return 1
    return 1 + 2 * required_steps(n-1)

আরও শক্তিশালী সংস্করণ শূন্য এবং নেতিবাচক মানগুলিও পরিচালনা করবে:

def required_steps(n):
    if n < 0:
        raise ValueError("n must be non-negative")
    if n == 0:
        return 0
    return 1 + 2 * required_steps(n-1)

(অ-পূর্ণসংখ্যার জন্য একটি চেক যোগ করা অনুশীলন হিসাবে বাকি রয়েছে))


4
তবে required_steps(0)এখন অসীম পুনরাবৃত্তি ঘটায়
আপনাকে ধন্যবাদ

7
2^0 - 1== 0. ifএই ক্ষেত্রে অন্য একটি যুক্ত করুন ।
h4z3

9
@ ব্যবহারকারী 63৩৩১৩৩ হ্যাঁ, মোট ফাংশন কী তা আমি জানি। আপনি কি? কারণ এটি কখনই মোট ফাংশন হবে না। বা অন্যান্য উত্তরগুলি মোট কার্যকারিতা নয়। এবং হ্যাঁ, তাদের মোট কার্যকারিতা তৈরি করার জন্য আরও কোডের প্রয়োজন হবে। - আমি যেমন বলেছি, আমাদের কোনও ডোমেন নেই। আমাদের ডোমেনটি কি অনুমান করা উচিত? এমনকি যদি এটি ন্যায়সঙ্গত হয় তবে intএন <0 এ কী করা উচিত তা আমরা জানি না। গণনা? একটি ত্রুটি ছুড়ে? ফিরবেন 0? এই ক্ষেত্রে, আমরা কেবল একটি আংশিক ফাংশন করতে পারি (ফলাফলটি কী তা আমরা জানি এমন জিনিসগুলির জন্য এটি সংজ্ঞায়িত করুন)।
h4z3

4
ওপির কোডের বেস কেসটি সাব-প্রবলেমের জন্য 0এবং ব্যবহার n - 1হয়। প্রাকৃতিক সংখ্যাগুলির একটি ডোমেন একটি ভাল ফিট বলে মনে হচ্ছে।
আপনাকে ধন্যবাদ

4
তোমাকে অনেক ধন্যবাদ! আমার বিনীত মতে এটি আমার নির্দিষ্ট সমস্যার জন্য সেরা সমাধান। আমি এন এর পক্ষে সম্ভাব্য মানগুলি বর্ণনা করিনি, সত্যিই দুঃখিত! আমি জানি যে তা অত্যন্ত গুরুত্বপূর্ণ ... অনুশীলনটি বলে: "আপনি ধরে নিতে পারেন যে প্যারামিটার এন সর্বদা একটি ধনাত্মক পূর্ণসংখ্যার এবং 0 এর চেয়ে বড়"
কাজিস

37

পুনরাবৃত্তির পদ্ধতির সাথে কোনও সমস্যার সমাধান করার জন্য আপনাকে খুঁজে বের করতে হবে যে আপনি কোনও আলাদা ইনপুট দিয়ে একই ফাংশনটির ক্ষেত্রে কোনও প্রদত্ত ইনপুট দিয়ে কীভাবে ফাংশনটি সংজ্ঞায়িত করতে পারেন। এই ক্ষেত্রে, যেহেতু f(n) = 2 * f(n - 1) + 1, আপনি এটি করতে পারেন:

def required_steps(n):
    return n and 2 * required_steps(n - 1) + 1

যাতে:

for i in range(5):
    print(required_steps(i))

আউটপুট:

0
1
3
7
15

9

আপনি অন্য ফাংশনে সত্যিকারের পুনরাবৃত্ত অংশটি নিষ্কাশন করতে পারেন

def f(n):
    return required_steps(n) - 1

অথবা আপনি একটি পতাকা সেট করতে পারেন এবং বিয়োগ করার সময় ঠিক করতে পারেন

def required_steps(n, sub=True):
    if n == 0: return 1
    return 2 * required_steps(n-1, False) - sub

>>> print(required_steps(10))
1023

0

ফলাফলের জন্য অতিরিক্ত প্যারামিটার ব্যবহার করে, r-

def required_steps (n = 0, r = 1):
  if n == 0:
    return r - 1
  else:
    return required_steps(n - 1, r * 2)

for x in range(6):
  print(f"f({x}) = {required_steps(x)}")

# f(0) = 0
# f(1) = 1
# f(2) = 3
# f(3) = 7
# f(4) = 15
# f(5) = 31

আপনি এটি বিটওয়াইড বাম পাশের শিফ্ট ব্যবহার করেও লিখতে পারেন, <<-

def required_steps (n = 0, r = 1):
  if n == 0:
    return r - 1
  else:
    return required_steps(n - 1, r << 1)

আউটপুট একই


2
একটি সাধারণ গুণ ব্যায়ামের জন্য বিটওয়াইজ অপারেশনগুলিতে জড়িত হওয়া অযৌক্তিক .. মোটেই পঠনযোগ্য নয়। এছাড়াও, elseউভয়
ফাংশনেই

পার্থক্যটি কেবলমাত্র পরিবর্তিত r * 2হচ্ছে r << 1এবং এটি "মোটেই পঠনযোগ্য নয়"? 😂
আপনাকে ধন্যবাদ

2
একটি 2nd প্যারামিটার উদ্ভাবন ঠিক যে বদল আনতে বাম একটি লুপ এই সক্রিয় nকয়েকবার এবং তারপর subtracts 1. এমনকি কম মার্জিত তারপর প্রয়োজনীয় মনে, যদিও পুরো জিনিস অদক্ষতা বনাম একটি ব্যায়াম (1<<n) - 1
পিটার কর্ডস

1
@ পিটারকর্ডস: রাষ্ট্রকে সঞ্চয়ের প্যারামিটারে সরানো হ'ল পুনরাবৃত্ত কলকে একটি পুচ্ছ-পুনরাবৃত্তি কলটিতে রূপান্তর করার মানক উপায় way এখন, দুর্ভাগ্যবশত, পাইথন যথাযথ লেঙ্গুড় কল, এমনকি যথাযথ লেঙ্গুড় Recursion সমর্থন করে না, কিন্তু তার মানে এই নয় যে, এই তাই শিখতে আপনি এটি অন্যান্য ভাষায় যে আবেদন করতে পারেন একটি দরকারী কৌশল নয় কি যথাযথ লেঙ্গুড় কল বাস্তবায়ন বা কমপক্ষে যথাযথ টেল পুনরাবৃত্তি।
জার্গ ডব্লু মিট্টাগ

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

0

N এর মূল মানটি মনে রাখার জন্য একটি স্থানধারক রাখুন এবং তারপরে প্রথম ধাপের জন্য n == N, ফিরে আসুন2^n-1

n = 10
# constant to hold initial value of n
N = n
def required_steps(n, N):
    if n == 0:
        return 1
    elif n == N:
        return 2 * required_steps(n-1, N) - 1
    return 2 * required_steps(n-1, N)

required_steps(n, N)

-1

"-1" অফসেট পাওয়ার একটি উপায় হ'ল ডিফল্ট মান সহ একটি আর্গুমেন্ট ব্যবহার করে প্রথম ফাংশন কল থেকে রিটার্নে প্রয়োগ করা, তারপরে পুনরাবৃত্তির কলগুলির সময় স্পষ্টভাবে অফসেট আর্গুমেন্টটি শূন্যে সেট করুন।

def required_steps(n, offset = -1):
    if n == 0:
        return 1
    return offset + 2 * required_steps(n-1,0)

-1

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

def outer(n):
    k=n
    def p(n):
        if n==1:
            return 2
        if n==k:
            return 2*p(n-1)-1
        return 2*p(n-1)
    return p(n)

n=5
print(outer(n))

মূলত, এটি n কে কে একটি বিশ্বব্যাপী মান নির্ধারণ করে এবং উপযুক্ত তুলনা করে এর মাধ্যমে পুনরাবৃত্তি করছে।

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