जिस तरह से आप यह लिखा है, यह समाप्त नहीं करता, तो यह जैसे 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}
*)
(हम इस को सही ढंग से चलाने के लिए प्राप्त करने के लिए प्रत्यावर्तन सीमा को बढ़ाने की जरूरत है)।
यह सब कुछ पचाने में मुझे कुछ समय लगेगा - धन्यवाद! –
@ एम-वी अच्छी तरह से मुझे लगता है कि उत्तर @Thies प्रदान करता है आपके मूल प्रयास की भावना में अधिक है (और उसका फिक्स बिल्कुल उपरोक्त की रेखाओं के साथ है, यानी, रिकर्सन को नीचे से बाहर करने के लिए आधारभूत मामला प्रदान करें)। लेकिन निश्चित रूप से मुझे लगता है कि ऊपर दिए गए तरीकों को समझना आसान और अधिक लचीला है (मुझे सॉव/रीप का संयोजन पसंद है, इसलिए इसे अक्सर इस्तेमाल करें) – acl
+1। मैंने यहां इस पर भी चर्चा की: http://www.mathprogramming-intro.org/book/node515.html, मेरे अंतिम समाधान के साथ आपके समान ही है। –