এই পুনরাবৃত্তির কোডটি কীভাবে বোঝবেন?


12

আমি এই কোডটি ম্যানুয়ালটিতে An Introduction to Programming in Emacs Lispসারণির condপ্রবেশ সংখ্যার উপর ভিত্তি করে নুড়িগুলির সংখ্যা নির্ধারণের জন্য ফাংশনের সাহায্যে পুনরুক্তি প্রদর্শন করেছিলাম , যদি সারি = 2 হয়, তবে নুড়িগুলি 3 হওয়া উচিত, যদি 4 সারি হয় তবে এটি 10 ​​টি নুড়ি হওয়া উচিত আছে।

(defun triangle-using-cond (number)
  (cond ((<= number 0) 0)
        ((= number 1) 1)
        ((> number 1)
         (+ number (triangle-using-cond (1- number))))))

যুক্তি 4 পাস করার পরে 10 এ মূল্যায়ন করুন:

(triangle-using-cond 4)

ম্যানুয়ালটিতে বিশেষত এই উদাহরণ কোডের প্রতিটি ধাপে কী ঘটেছিল তা স্পষ্টভাবে ব্যাখ্যা করে না এবং এখানে কীভাবে পুনরাবৃত্তি কাজ করে তা আমি বুঝতে পারি না। যদি আপনার সাহায্যের আমাকে বলবিজ্ঞান বুঝতে Pls পারি ধাপে ধাপে প্রতিটি উদাহরণস্বরূপ এ কি হবে?


আমি অন্য কাউকে আপনাকে "পুনরাবৃত্তি" শব্দটি সাহায্য করতে দেব (কারণ আমি এটিকে এই প্রসঙ্গে তুলনায় আলাদা কিছু বলে মনে করি) বা আমি কী লিখতে চলেছি তা আরও ভাল করে ব্যাখ্যা করব: (ক) সংখ্যাটি কম বা সমান হলে থেকে 0, তারপর 0; (খ) যদি সংখ্যাটি 1 এর সমান হয়, তবে 1; (গ) যদি সংখ্যাটি 1 এর চেয়ে বেশি হয়, তবে সংখ্যাটি triangle-using-condযাই হোক না কেন তার চেয়ে কম 1 যুক্তি যুক্ত করে ফাংশন দ্বারা ফিরিয়ে দেওয়া মানটিতে সংখ্যা যুক্ত করুন। শর্তগুলি ক, খ এবং তারপরে সি এর ক্রম অনুসারে যায় - প্রথমে যা কিছু ম্যাচ হয়, সেখানেই বাক থামে।
আইনজীবি

যথারীতি এলিসপ ইন্টারপ্রেটার অন্তর্নিহিত থেকে বহির্মুখী পর্যন্ত মূল্যায়ন করে। এইভাবে 1-4 = 3,। এখন পুনরাবৃত্তি কলটি হবে (triangle-using-cond 3), কিন্তু এটি একই পুনরাবৃত্ত কলটির সাথে শেষ হয়ে যাবে যতক্ষণ না এটি 1 টি শর্তসাপেক্ষে আঘাত করে, তাই না? পরবর্তীতে কী হবে?
ডক্টরেট

ওহ, আমি দেখতে পেয়েছি - ফাংশনটি 3 ধাপে নিজেকে পুনরায় ব্যবহার করে - ঠিক আছে, ভাল পয়েন্ট।
আইনজীবি

আমি ভাবছি এর ফলাফল কী হবে (triangle-using-cond 3)?
ডক্টরেট

2
nb ফাংশনটির 1-একটি বিশেষভাবে বিভ্রান্তিমূলক নাম রয়েছে, বিশেষত যদি আপনি কোনও কল পড়েন যেমন এটি ইনফিক্স নোটেশন। এটি তার যুক্তি বিয়োগ বিয়োগ করে; একটি বিয়োগ বিয়োগ।
ফিল্ডস

উত্তর:


14

"প্রিন্টফ ডিবাগিং" ব্যবহার করে

ফাংশন সংজ্ঞাটি সংশোধন করে আপনি ইমাসকে আপনাকে বুঝতে সহায়তা করতে পারেন:

(defun triangle-using-cond (number)
  (message (format "called with %d" number))
  (cond ((<= number 0) 0)
        ((= number 1) 1)
        ((> number 1)
         (+ number (triangle-using-cond (1- number))))))

বাফারে (message ...)একটি ট্রেইল মুদ্রণের জন্য কেবল কোথাও যুক্ত করুন *Messages*

ইডিবাগ ব্যবহার করা হচ্ছে

ফাংশন সংজ্ঞাটির ভিতরে যে কোনও জায়গায় পয়েন্ট করুন এবং C-u C-M-xএটি "উপকরণ" টিপুন । তারপরে ফাংশনটি মূল্যায়ন করুন, উদাহরণস্বরূপ পয়েন্ট স্থাপন (triangle-using-cond 3)এবং আঘাতের মাধ্যমে C-x C-e

আপনি এখন ইডিবাগ মোডে আছেন। ফাংশনটি সরাতে স্পেস বারটি হিট করুন। প্রতিচ্ছবিটির মধ্যবর্তী মানগুলি প্রতিধ্বনির ক্ষেত্রগুলিতে প্রদর্শিত হয়। ইদেবগ মোড থেকে বেরিয়ে আসার জন্য কেবল হিট করুন q। উপকরণটি সরাতে, সংজ্ঞাটির ভিতরে যে কোনও জায়গায় পয়েন্ট রেখে সংজ্ঞাটি C-M-xপুনরায় মূল্যায়নের জন্য হিট করুন ।

স্ট্যান্ডার্ড ইম্যাকস ডিবাগার ব্যবহার করা

M-x debug-on-entry triangle-using-cond, তারপরে, যখন triangle-using-condআহ্বান করা হয়, আপনাকে ইম্যাক্স ডিবাগারে (বাফার *Backtrace*) স্থাপন করা হবে।

মূল্যায়নের মাধ্যমে পদক্ষেপ d(অথবা cকোনও উদ্বেগমূলক মূল্যায়নের মাধ্যমে এড়িয়ে যেতে)।

মধ্যবর্তী অবস্থা (পরিবর্তনশীল মান ইত্যাদি) দেখতে আপনি eযে কোনও সময় ব্যবহার করতে পারেন । আপনাকে মূল্যায়নের জন্য একটি সেক্সপ প্রবেশের অনুরোধ জানানো হবে এবং মূল্যায়নের ফলাফলটি মুদ্রিত হবে।

আপনি ডিবাগারটি ব্যবহার করার সময়, উত্স কোডের একটি অনুলিপি অন্য ফ্রেমে দৃশ্যমান রাখুন, তাই যা চলছে তা আপনি অনুসরণ করতে পারেন।

আপনি উত্স কোডে স্বেচ্ছাসেবী জায়গায় ডিবাগার (আরও বা কম ব্রেকপয়েন্ট) প্রবেশ করতে সুস্পষ্ট কল inোকাতে পারেন can আপনি sertোকান (debug)বা (debug nil SOME-SEXP-TO-EVALUATE)। পরবর্তী ক্ষেত্রে, ডিবাগারটি প্রবেশ SOME-SEXP-TO-EVALUATEকরা হলে মূল্যায়ন করা হয় এবং ফলাফল মুদ্রিত হয়। (মনে রাখবেন যে আপনি উত্স কোডে এই জাতীয় কোড C-M-xinোকাতে পারেন এবং এটি মূল্যায়নের জন্য ব্যবহার করতে পারেন, তারপরে পূর্বাবস্থায় ফিরুন - আপনার সম্পাদিত ফাইলটি সংরক্ষণ করার দরকার নেই))

Using Debuggerআরও তথ্যের জন্য এলিসপ ম্যানুয়াল, নোড দেখুন।

একটি লুপ হিসাবে পুনরাবৃত্তি

যাইহোক, লুপ হিসাবে পুনরাবৃত্তি ভাবেন। এখানে দুটি সমাপ্তির সংজ্ঞা দেওয়া আছে: (<= number 0)এবং (= number 1)। এই ক্ষেত্রে ফাংশনটি একটি সাধারণ সংখ্যা দেয়।

পুনরাবৃত্তির ক্ষেত্রে ফাংশনটি সেই সংখ্যার যোগফল এবং ফাংশনের ফলাফল প্রদান করে number - 1। শেষ পর্যন্ত, ফাংশনটি 1শূন্যের চেয়ে ছোট বা সমান সংখ্যক বা একটি সংখ্যার সাথে কল করা হবে।

পুনরাবৃত্ত মামলার ফলাফল তাই:

(+ number (+ (1- number) (+ (1- (1- number)) ... 1)

উদাহরণস্বরূপ নিন (triangle-using-cond 4)। আসুন চূড়ান্ত অভিব্যক্তি জমে:

  • প্রথম পুনরাবৃত্তির numberহয় 4তাই হয়, (> number 1)শাখা অনুসরণ করা হয়। আমরা একটি এক্সপ্রেশন তৈরি করা শুরু করি (+ 4 ...এবং সাথে ফাংশনটি কল করি (1- 4), অর্থাৎ (triangle-using-cond 3)

  • এখন numberহয় 3, এবং ফল (+ 3 (triangle-using-cond 2))। মোট ফলাফল প্রকাশ হয় (+ 4 (+ 3 (triangle-using-cond 2)))

  • numberহয় 2, এখন তাই অভিব্যক্তি(+ 4 (+ 3 (+ 2 (triangle-using-cond 1))))

  • numberহয় 1এখন, এবং আমরা নিতে (= number 1)শাখা, একটি বিরক্তিকর ফলে 1। পুরো এক্সপ্রেশন হয় (+ 4 (+ 3 (+ 2 1)))। আউট ভিতর থেকে মূল্যায়ন এবং আপনি পান: (+ 4 (+ 3 3)), (+ 4 6), বা শুধু 10


3
এডিবগ আরও ভাল হবে। =)
মালবারবা

কীভাবে ট্রেইলটি মুদ্রণ করা যায় message (...), আঘাত C-x C-eকরে চূড়ান্ত ফলাফলটি দেখায় (10) আর কিছুই নয়? আমি কিছু অনুপস্থিত করছি?
ডক্টরেট

@ মালাবারবা, কীভাবে Edebugপদক্ষেপ নেবেন ?
ডক্টরেট

1
@ ডক্টরেট হিট C-u C-M-xএটি edebug ফাংশন ভিতরে পয়েন্ট। তারপরে কেবল সাধারণ হিসাবে ফাংশনটি চালান।
মালবারবা

@ বাফারে স্টাফের (message ...)প্রিন্টগুলিতে ডক্টরেট করুন *Message*
রেকাডো

6

এসআইসিপি থেকে পদ্ধতি প্রয়োগের জন্য সাবস্টিটিউশন মডেল কোডটি বোঝার জন্য অ্যালগরিদমকে ব্যাখ্যা করতে পারে।

এটির সুবিধার্থে আমি কিছু কোড লিখেছি। লসি প্যাকেজ lispy-flattenথেকে এটি করে। এখানে প্রয়োগের ফলাফল উপস্থিত lispy-flattenথেকে (triangle-using-cond 4):

(cond ((<= 4 0)
       0)
      ((= 4 1)
       1)
      ((> 4 1)
       (+ 4 (triangle-using-cond (1- 4)))))

আপনি উপরের অভিব্যক্তিটিকে কেবলমাত্র সহজ করতে পারেন:

(+ 4 (triangle-using-cond 3))

তারপরে আরও একবার সমতল করুন:

(+ 4 (cond ((<= 3 0)
            0)
           ((= 3 1)
            1)
           ((> 3 1)
            (+ 3 (triangle-using-cond (1- 3))))))

চূড়ান্ত ফলাফল:

(+ 4 (+ 3 (+ 2 1)))

3

এই এ গিয়ে Emacs / Elisp নির্দিষ্ট নয়, কিন্তু আপনি একটি গণিত পটভূমি থাকে, তখন পুনরাবৃত্তির গাণিতিক আনয়ন মত হল । (বা যদি আপনি তা না করেন: তবে আপনি যখন অন্তর্ভুক্তি শিখবেন তখন এটি পুনরাবৃত্তির মতো!)

সংজ্ঞা দিয়ে শুরু করা যাক:

(defun triangle-using-cond (number)
  (cond ((<= number 0) 0)
        ((= number 1) 1)
        ((> number 1)
         (+ number (triangle-using-cond (1- number))))))

কখন numberহয় 4, প্রথম দুটি শর্ত দুটিই ধারণ করে না, সুতরাং এটি তৃতীয় শর্ত অনুসারে মূল্যায়ন করা হয়:
(triangle-using-cond 4)যেমন হিসাবে মূল্যায়ন করা
(+ number (triangle-using-cond (1- number)))হয়
(+ 4 (triangle-using-cond 3))

একইভাবে,
(triangle-using-cond 3)হিসাবে মূল্যায়ন করা হয়
(+ 3 (triangle-using-cond 2))

একইভাবে, (triangle-using-cond 2)হিসাবে মূল্যায়ন করা হয়
(+ 2 (triangle-using-cond 1))

তবে এর জন্য (triangle-using-cond 1), দ্বিতীয় শর্তটি ধারণ করে এবং এটি হিসাবে মূল্যায়ন করা হয় 1

যে কেউ পুনরাবৃত্তি শিখছে তাদের জন্য একটি পরামর্শ: এড়াতে চেষ্টা করুন

পুনরাবৃত্তি কল কাজ করে (কখনও কখনও বিশ্বাসের পুনরাবৃত্ত লিপ বলা হয়) এই বিশ্বাসের পরিবর্তে পুনরাবৃত্ত কলের সময় কী ঘটে যায় সে সম্পর্কে ভাবার চেষ্টা করার সাধারণ প্রাথমিক ভুল।

আপনি যদি নিজেকে (triangle-using-cond 4)সঠিক উত্তরটি ফিরিয়ে দেবেন কিনা তা বোঝানোর চেষ্টা করছেন , কেবলমাত্র অনুমান করুন যে সঠিক উত্তরটি (triangle-using-cond 3)ফিরে আসবে, এবং এটি সেই ক্ষেত্রে সঠিক হবে কিনা তা যাচাই করুন। অবশ্যই আপনাকে বেস কেসটিও যাচাই করতে হবে।


2

আপনার উদাহরণের জন্য গণনার পদক্ষেপগুলি নিম্নলিখিতগুলির মতো হবে:

(4 +               ;; step 1
   (3 +            ;; step 2
      (2 +         ;; step 3
         (1))))    ;; step 4
=> 10

0 শর্তটি আসলে কখনই পূরণ হয় না কারণ 1 ইনপুট হিসাবে ইতিমধ্যে পুনরাবৃত্তি শেষ করে।


(1)একটি বৈধ এক্সপ্রেশন নয়।
রেকাডো

1
এটি দিয়ে ঠিক জরিমানা মূল্যায়ন করে M-x calc। :-) গুরুতরভাবে যদিও, আমি হিসাবটি দেখানোর কথা বলতে চাইছি, লিস্পের মূল্যায়ন নয়।
পেপ্রিকা

ওহ, আমি এটি এমনকি আপনার উত্তরের (4 +পরিবর্তে লক্ষ্য করিনি (+ 4... :)
রেকাডো

0

আমি মনে করি এটি বেশ সহজ, এটির অধীনে আপনার ইমাস লিস্পের দরকার নেই, এটি কেবল প্রাথমিক বিদ্যালয়ের গণিত।

f (0) = 0

f (1) = 1

f (n) = f (n-1) + n যখন এন> 1

সুতরাং চ (5) = 5 + চ (4) = 5 + 4 + চ (3) = 5 + 4 + 3 + 2 + 1 + 0

এখন এটা সুস্পষ্ট।


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