ดังที่คนอื่น ๆ ชี้ให้เห็นการวิเคราะห์การเรียกซ้ำสามารถทำได้ยากมากอย่างรวดเร็ว นี่เป็นอีกตัวอย่างของสิ่งนั้น: http://rosettacode.org/wiki/Mutual_recursion http://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences
มันยากที่จะคำนวณคำตอบและเวลาทำงานสำหรับสิ่งเหล่านี้ นี่เป็นเพราะฟังก์ชั่นที่เกิดซ้ำซึ่งกันและกันเหล่านี้มี "รูปแบบที่ยาก"
ลองดูตัวอย่างง่ายๆนี้:
http://pramode.net/clojure/2010/05/08/clojure-trampoline/
(declare funa funb)
(defn funa [n]
(if (= n 0)
0
(funb (dec n))))
(defn funb [n]
(if (= n 0)
0
(funa (dec n))))
เริ่มจากการลองคำนวณfuna(m), m > 0
:
funa(m) = funb(m - 1) = funa(m - 2) = ... funa(0) or funb(0) = 0 either way.
เวลาทำงานคือ:
R(funa(m)) = 1 + R(funb(m - 1)) = 2 + R(funa(m - 2)) = ... m + R(funa(0)) or m + R(funb(0)) = m + 1 steps either way
ตอนนี้ลองเลือกตัวอย่างที่ซับซ้อนกว่านี้อีกเล็กน้อย:
แรงบันดาลใจจากhttp://planetmath.org/encyclopedia/MutualRecursion.htmlซึ่งเป็นการอ่านที่ดีด้วยตัวเองลองดูที่: "" "ตัวเลข Fibonacci สามารถตีความได้ผ่านการสอบถามซ้ำ: F (0) = 1 และ G (0 ) = 1, ด้วย F (n + 1) = F (n) + G (n) และ G (n + 1) = F (n). "" "
แล้ว runtime ของ F คืออะไร? เราจะไปทางอื่น
ดี R (F (0)) = 1 = F (0); R (G (0)) = 1 = G (0)
ตอนนี้ R (F (1)) = R (F (0)) + R (G (0)) = F (0) + G (0) = F (1)
...
ไม่ยากเลยที่จะเห็นว่า R (F (m)) = F (m) - เช่นจำนวนการเรียกใช้ฟังก์ชันที่จำเป็นในการคำนวณหมายเลขฟีโบนักชีที่ดัชนีฉันเท่ากับค่าของหมายเลขฟีโบนักชี ที่ดัชนีฉัน นี่เป็นการสันนิษฐานว่าการรวมตัวเลขสองตัวเข้าด้วยกันนั้นเร็วกว่าการเรียกใช้ฟังก์ชันมาก หากไม่ใช่ในกรณีนี้จะเป็นจริง: R (F (1)) = R (F (0)) + 1 + R (G (0)) และการวิเคราะห์สิ่งนี้จะซับซ้อนกว่านี้ อาจไม่มีวิธีแก้ปัญหาแบบปิดง่าย
รูปแบบปิดสำหรับลำดับฟีโบนักชีนั้นไม่จำเป็นต้องง่ายต่อการผสมซ้ำไม่ต้องพูดถึงตัวอย่างที่ซับซ้อนมากขึ้น