2011-06-30 13 views
6

मैं गणित के लिए नया हूं और पैटर्न और नियमों को समझने की कोशिश कर रहा हूं।गणित में Collatz अनुमान

 
A = {1, 2, 3, 4} 
A //. {x_?EvenQ -> x/2, x_?OddQ -> 3 x + 1} 

इस पर आधारित है:: तो मैं निम्नलिखित की कोशिश की http://en.wikipedia.org/wiki/Collatz_conjecture

इस अभिसरण माना जाता है, लेकिन क्या मुझे मिल गया है:

 
ReplaceRepeated::rrlim: Exiting after {1,2,3,4} scanned 65536 times. >> 

कृपया मेरी मदद में मेरी त्रुटि को समझें पैटर्न/नियम।

सादर

उत्तर

9

जिस तरह से आप यह लिखा है, यह समाप्त नहीं करता, तो यह जैसे 1 और 4, 2 आदि के बीच बारी-बारी से समाप्त होता है (सभी पुनरावर्ती विवरण अंततः कहीं बाहर नीचे, और अपने एक को शामिल नहीं करता चाहिए n=1 पर ऐसा करने के लिए मामला)।

यह काम करता है:

ClearAll[collatz]; 
collatz[1] = 1; 
collatz[n_ /; EvenQ[n]] := collatz[n/2] 
collatz[n_ /; OddQ[n]] := collatz[3 n + 1] 

हालांकि यह मध्यवर्ती परिणामों की सूची नहीं देता है। उन्हें प्राप्त करने के लिए एक सुविधाजनक तरीका

ClearAll[collatz]; 
collatz[1] = 1; 
collatz[n_ /; EvenQ[n]] := (Sow[n]; collatz[n/2]) 
collatz[n_ /; OddQ[n]] := (Sow[n]; collatz[3 n + 1]) 
runcoll[n_] := [email protected]@Reap[collatz[n]] 

runcoll[115] 
(* 
-> {115, 346, 173, 520, 260, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 
28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1} 
*) 

या

colSeq[x_] := NestWhileList[ 
Which[ 
EvenQ[#], #/2, 
True, 3*# + 1] &, 
x, 
# \[NotEqual] 1 &] 
तो

कि जैसे

colSeq[115] 
(* 
-> {115, 346, 173, 520, 260, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 
28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1} 
*) 

वैसे सबसे तेजी से दृष्टिकोण मैं के साथ आ सकता है (मुझे लगता है कि मैं के लिए यह आवश्यक कुछ प्रोजेक्ट यूलर समस्या)

[email protected]; 
collatz[1] := {1} 
collatz[n_] := collatz[n] = If[ 
    EvenQ[n] && n > 0, 
    {n}~Join~collatz[n/2], 
    {n}~Join~collatz[3*n + 1]] 
जैसे कुछ था

तुलना:

colSeq /@ Range[20000]; // Timing 
(* 
-> {6.87047, Null} 
*) 

जबकि

Block[{$RecursionLimit = \[Infinity]}, 
    collatz /@ Range[20000];] // Timing 
(* 
-> {0.54443, Null} 
*) 

(हम इस को सही ढंग से चलाने के लिए प्राप्त करने के लिए प्रत्यावर्तन सीमा को बढ़ाने की जरूरत है)।

+0

यह सब कुछ पचाने में मुझे कुछ समय लगेगा - धन्यवाद! –

+0

@ एम-वी अच्छी तरह से मुझे लगता है कि उत्तर @Thies प्रदान करता है आपके मूल प्रयास की भावना में अधिक है (और उसका फिक्स बिल्कुल उपरोक्त की रेखाओं के साथ है, यानी, रिकर्सन को नीचे से बाहर करने के लिए आधारभूत मामला प्रदान करें)। लेकिन निश्चित रूप से मुझे लगता है कि ऊपर दिए गए तरीकों को समझना आसान और अधिक लचीला है (मुझे सॉव/रीप का संयोजन पसंद है, इसलिए इसे अक्सर इस्तेमाल करें) – acl

+0

+1। मैंने यहां इस पर भी चर्चा की: http://www.mathprogramming-intro.org/book/node515.html, मेरे अंतिम समाधान के साथ आपके समान ही है। –

7

आपको रिकर्सिव केस सही मिला है, लेकिन आपके पास रिकर्सन को समाप्त करने के लिए कोई आधारभूत मामला नहीं है जो अनंत रिकर्सन (या जब तक मैथमैटिका पैटर्न प्रतिस्थापन सीमा को हिट नहीं करता) तक पहुंच जाता है। यदि आप को रोकने के लिए जब आप 1 तक पहुँचने, यह उम्मीद के रूप में काम करता है:

In[1]:= A = {1,2,3,4} 
Out[1]= {1,2,3,4} 

In[2]:= A //. {x_?EvenQ /; x>1 -> x/2, x_?OddQ /; x>1 -> 3 x+1} 
Out[2]= {1,1,1,1} 
4

प्रलेखन केंद्र में, the section about writing packages एक Collatz समारोह उदाहरण में दिखाया गया है।

+1

+1। जैसा कि मैंने यहां चर्चा की: http: //www.mathprogramming-intro.org/book/node515.html, जिस समाधान से आप लिंक करते हैं (जिसे शायद रोमन मैडर की पुस्तक से लिया गया है) अवधारणात्मक रूप से स्पष्ट है लेकिन प्रदर्शन के मामले में इष्टतम नहीं है । –