समारोह के दूसरे फोन पर हमेशा के लिए चलाता है:SBCL समारोह
एक सूची lst वापसी को देखते हुए वास्तव में लंबाई कश्मीर की सूची की सामग्री है, जो सूची की लंबाई के चूक यदि उपलब्ध नहीं के सभी क्रमपरिवर्तन।
(defun permute (lst &optional (k (length lst)))
(if (= k 1)
(mapcar #'list lst)
(loop for item in lst nconcing
(mapcar (lambda (x) (cons item x))
(permute (remove-if (lambda (x) (eq x item)) lst)
(1- k))))))
समस्या
: मैं SBCL से जुड़ा Emacs में कीचड़ उपयोग कर रहा हूँ, मैं बहुत अधिक अनुकूलन अभी तक नहीं किया है। समारोह छोटे इनपुट जैसे lst = '(1 2 3 4 5 6 7 8) के = 3 पर ठीक काम करता है, जिसका प्रयोग ज्यादातर अभ्यास में किया जाएगा। हालांकि जब मैं इसे लगातार दो बार एक बड़े इनपुट के साथ बुलाता हूं तो दूसरी कॉल कभी वापस नहीं आती है और एसबीसीएल शीर्ष पर भी दिखाई नहीं देता है। ये परिणाम आरपीएल:
CL-USER> (time (nth (1- 1000000) (permute '(0 1 2 3 4 5 6 7 8 9))))
Evaluation took:
12.263 seconds of real time
12.166150 seconds of total run time (10.705372 user, 1.460778 system)
[ Run times consist of 9.331 seconds GC time, and 2.836 seconds non-GC time. ]
99.21% CPU
27,105,349,193 processor cycles
930,080,016 bytes consed
(2 7 8 3 9 1 5 4 6 0)
CL-USER> (time (nth (1- 1000000) (permute '(0 1 2 3 4 5 6 7 8 9))))
और यह दूसरी कॉल से कभी वापस नहीं आता है। मैं केवल अनुमान लगा सकता हूं कि किसी कारण से मैं कचरा कलेक्टर के लिए कुछ भयानक कर रहा हूं लेकिन मैं नहीं देख सकता। क्या किसी के पास कोई विचार है?
ऐसा होने पर आपके * अवरुद्ध-लिस्प * बफर में कुछ भी दिलचस्प है? – Xach
क्यों एसबीसीएल को बाधित नहीं करते हैं और बैकट्रैक को देखते हैं कि यह क्या करता है? –
उत्तर देने वाले सभी लोगों के लिए एक सामान्य प्रश्न के रूप में।ऐसा लगता है कि मैं जो कचरा बना रहा हूं वह समस्या है। क्या इस तरह की चीजों को पाने के तरीके के बारे में कोई अच्छा लेख है? मैंने कुछ चीजें की हैं जिन्हें मैंने सोचा था लेकिन सार्वभौमिक रूप से उन्होंने वास्तव में इसे और भी बदतर बना दिया है। – asm