নিচের function টাতে 100 এর কম পাঠালে always 91 return করে কেন?

int f91(int N)
{
    if(N <= 100){

        return f91(f91(N+11));
    }
    else {

        return N - 10;
    }
}

asked 02 Jul '16, 14:23

uchiha%20amit's gravatar image

uchiha amit
1206

edited 02 Jul '16, 16:47

Tamanna%20Nishat%20Rini's gravatar image

Tamanna Nishat Rini ♦♦
2.9k311


এটা স্যার জন ম্যাকার্থির f91 ফাংশন। এটা একটা রিকার্সিভ ফাংশন। এটা উনি একটা টেস্ট কেস হিসেবে ব্যবহার করেছিলেন, যেখানে ১০০ এর সমান বা ছোট যেকোন Integer নাম্বারের জন্য ফলাফল ৯১-ই দেখাবে। আশা করি তুমি রিকার্সিভ ফাংশন সম্পর্কে জানো, যে ফাংশন নিজেই নিজেকে call করে। বিস্তারিত এখানে দেখে নিতে পারো । এখন আসি ফাংশনটা কিভাবে কাজ করে। আমি একটা উদাহরণ দিয়ে দেখিয়ে দিচ্ছি, তুমি অন্য সংখ্যা দিয়ে চেষ্টা করে দেখো।

প্রথমেই ধরি, N = 100 , এটা আমাদের if কন্ডিশনকে satisfied করে তাই এটা if ব্লকে ঢুঁকে যাবে। if এর ভেতরে আমাদের আছে,

return f91(f91(N+11))

এখানে আমরা N এর মান বসাই

  1. f91 (f91(100+11)) , তাহলে এখন N = 100+11 = 111 । তাহলে ফাংশনের return স্টেটমেন্টটা হবে এমনঃ f91 ( f91(111) ) , দেখো এখানে আবার একটা f91(111) অর্থাৎ, f91(N) ফাংশন আছে। এখানে N = 111। যা আমাদের if কন্ডিশন N<=100 কে satisfied করে না। তাহলে এটা চলে যাবে Else এ ।

  2. Else এ আসার পর N এর মান আবার আপডেট হবে। যেহেতু রিটার্নে দেয়া আছে N-10 , তাহলে N = N - 10 হবে N = 111-10 = 101

  3. আমাদের ১ নাম্বার পয়েন্টের সব কাজ কিন্তু শেষ হয় নাই। আমরা শুধু f91 ( f91(111) ) এটার ভিতরের অংশটুকুর কাজ করেছি। এখানে, f91(111) এর কাজ করে আমরা N এর নতুন মান আবার পেয়েছি, 101 (2 নাম্বার পয়েন্ট থেকে)। তাহলে এখন আমাদের ফাংশনের অবস্থা f91 (101) [ভিতরের f91(111) এর মান বসিয়ে] ।

  4. এখন 101 আবারো আমাদের if ব্লকে যাবে না সরাসরি চলে যাবে else. তখন আমরা আবার পাবো N = N - 10 = 101 -10 = 91 । ফাইনালি ফাংশনটা 91 return করবে আউটপুটে।

এভাবেই কোডটা কাজ করবে। তোমার যদি বুঝতে খুব বেশি সমস্যা হয় তুমি ফাংশনের রিটার্ন স্টেটমেন্ট দুইটার আগে একটা printf বসিয়ে N এর মান প্রিন্ট করে দেখতে পারো, কিভাবে মান চেঞ্জ হচ্ছে। তাহলে আশা করি বুঝতে পারবে।

permanent link

answered 03 Jul '16, 08:41

Tamanna%20Nishat%20Rini's gravatar image

Tamanna Nishat Rini ♦♦
2.9k311

আপু একটি সংখ্যা নিয়ে চিন্তা করলে বুজা যায় কেন ৯১ রিটার্ন করবে। কিন্তু সব সংখ্যার জন্য শেষমেষ ৯১ রিটার্ন করবে কেন সেটা ধরতে পারছি না।

(03 Jul '16, 13:22) uchiha amit

100 এর সমান বা কম যেকোনো ইনপুট এর জন্য -

রিকার্সিভ ফাংশনটি থামবে কেবল মাত্র যখন রিকার্সিভ কল এর কোন পর্যায়ে return f91(f91(N+11)) এর ভেতরের কল f91(N+11)N+11 = 111 হবে। কারন-

f91(f91(111)) = f91(101)       [ এখানে যেহেতু (N = 111 > 100), তাই f91(111) রিটার্ন করবে (N-10 = 111-10 = 101) ]  
              = 91             [ এখানে যেহেতু (N = 101 > 100), তাই f91(100) রিটার্ন করবে (N-10 = 101-10= 91)  ]

শুধু N+11= 111 এর জন্য এমন হয় কারণ:

f91( f91( N+11 ) )(N + 11) < 111 হলে - f91( N+11 ) <= 101 হবে ;

[ কারণ N > 100 হলে N = N - 10 হবে। আর N <= 100 হলে রিকারশন চলতে থাকবে এবং প্রতি কল এ N এর মান 11 করে বারতে বারতে একটি পর্যায়ে N > 100 হব এবং N = N - 10 হবে ]

অর্থাৎ, বাহিরের f91( x )x < 101 অথবা x <= 100 হওয়ায় recursion পুনরায় চলতে থাকবে এবং প্রতি কল এ N এর মান 11 করে বারতে থাকবে যতক্ষণ না পর্যন্ত f91( f91( N+11 ) )N + 11 == 111 হয়। আর N + 11 = 111 হলে output 91 আসবে যা পূর্বেই দেখানোো হয়েছে।

permanent link

answered 03 Jul '16, 16:56

Tiash's gravatar image

Tiash
213

আপনাকে অনেক ধন্যবাদ :)

(03 Jul '16, 19:41) uchiha amit
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×26
×2

question asked: 02 Jul '16, 14:23

question was seen: 331 times

last updated: 03 Jul '16, 19:41