LISP

2010-10-31 16 views
5

में पूंछ रिकर्सन का उपयोग करके बिनोमियल गुणांक मैं पूंछ रिकर्सन का उपयोग करके सी (एन, के) को खोजने के लिए एक फ़ंक्शन प्रोग्राम करना चाहता हूं, और मैं आपकी सहायता की बहुत सराहना करता हूं।LISP

मैं इस पर पहुँच गए हैं:

(defun tail-recursive-binomial (n k) 
    (cond ((or (< n k) (< k 0)) NIL) 
     ((or (= k 0) (= n k)) 1) 
     (T (* (tail-recursive-binomial (- n 1) (- k 1)) (/ n k))))) 

the following property of the binomial coefficients का उपयोग करना।

लेकिन मुझे नहीं पता कि रिकर्सिव कॉल को प्रत्येक उदाहरण द्वारा निष्पादित अंतिम निर्देश कैसे बनाया जाए, क्योंकि आखिरी उत्पाद है। मैं एक सहायक समारोह का उपयोग करके इसे आजमा रहा हूं, जो मुझे लगता है कि एकमात्र तरीका है, लेकिन मुझे कोई समाधान नहीं मिला है।

उत्तर

7

starblue पता चलता है, एक पुनरावर्ती सहायक समारोह का उपयोग करें:

(defun binom (n k) 
    (if (or (< n k) (< k 0)) 
    NIL ; there are better ways to handle errors in Lisp 
    (binom-r n k 1))) 

;; acc is an accumulator variable 
(defun binom-r (n k acc) 
    (if (or (= k 0) (= n k)) 
    acc 
    (binom-r (- n 1) (- k 1) (* acc (/ n k))))) 

या, 1 का डिफ़ॉल्ट मान (पुनरावर्ती आधार मामले) के साथ मुख्य कार्य एक optional संचायक तर्क दे:

(defun binom (n k &optional (acc 1)) 
    (cond ((or (< n k) (< k 0)) NIL) 
     ((or (= k 0) (= n k)) acc) 
     (T (binom (- n 1) (- k 1) (* acc (/ n k)))))) 

बाद वाला विकल्प थोड़ा कम कुशल है, क्योंकि प्रत्येक रिकर्सिव कॉल में त्रुटि स्थिति की जांच की जाती है।

+0

बहुत बहुत धन्यवाद। मैं पहले की तरह एक समाधान की तलाश में था (मैंने जो अन्य कार्यों को बनाया या देखा है), लेकिन मैं दूसरे को प्यार करता हूं, वास्तव में सुरुचिपूर्ण। – jesusiniesta

3

आपको अतिरिक्त तर्क के साथ एक सहायक फ़ंक्शन की आवश्यकता है, जिसका उपयोग आप कंप्यूटिंग और परिणाम पास करने के लिए करते हैं।

+0

यह मेरा प्रारंभिक दृष्टिकोण था, क्योंकि मैंने इस तरह से एक फैक्टोरियल फ़ंक्शन को कोड किया है, लेकिन मुझे इसे इस से प्राप्त नहीं हुआ है। धन्यवाद वैसे भी – jesusiniesta