ฟังก์ชัน Ackermann นั้นมีความโดดเด่นในการเป็นหนึ่งในตัวอย่างที่ง่ายที่สุดของฟังก์ชันที่คำนวณได้ทั้งหมดซึ่งไม่ได้เรียกซ้ำแบบดั้งเดิม
เราจะใช้คำจำกัดความของA(m,n)
การรับในจำนวนเต็มสองไม่ใช่ลบที่
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
คุณอาจใช้
- ฟังก์ชันที่ระบุชื่อหรือไม่ระบุชื่อโดยรับค่าจำนวนเต็มสองค่าเป็นอินพุตคืนค่าจำนวนเต็มหรือ
- โปรแกรมที่ใช้จำนวนเต็มสองช่องว่างหรือจำนวนเต็มคั่นบรรทัดใหม่บน STDIN พิมพ์ผลลัพธ์ไปที่ STDOUT
คุณไม่สามารถใช้ฟังก์ชัน Ackermann หรือฟังก์ชั่น hyperexponentiation จากห้องสมุดหากมีอยู่ แต่คุณสามารถใช้ฟังก์ชันอื่นจากห้องสมุดอื่น ๆ อนุญาตให้ใช้การยกกำลังแบบปกติ
ฟังก์ชันของคุณจะต้องสามารถหาค่าของA(m,n)
m of 3 และ n ≤ 10 ในเวลาน้อยกว่าหนึ่งนาที อย่างน้อยที่สุดมันจะต้องยุติตามทฤษฎีในอินพุตอื่น ๆ : เนื่องจากสแต็กสเปซที่ไม่มีที่สิ้นสุด, ประเภท Bigint ดั้งเดิม, และระยะเวลานานตามอำเภอใจ, มันจะกลับคำตอบ. แก้ไข:หากภาษาของคุณมีค่าความลึกการเรียกซ้ำเริ่มต้นที่ จำกัด เกินไปคุณอาจกำหนดค่าใหม่ได้โดยไม่ต้องเสียค่าตัวอักษร
การส่งที่มีจำนวนอักขระสั้นที่สุดจะชนะ
นี่คือค่าบางอย่างเพื่อตรวจสอบคำตอบของคุณ:
A | n=0 1 2 3 4 5 6 7 8 9 10
-----+-----------------------------------------------------------------
m=0 | 1 2 3 4 5 6 7 8 9 10 11
1 | 2 3 4 5 6 7 8 9 10 11 12
2 | 3 5 7 9 11 13 15 17 19 21 23
3 | 5 13 29 61 125 253 509 1021 2045 4093 8189
4 | 13 65533 big really big...
A(3,8)
และสูงกว่าที่ไร้เดียงสาเหมือนที่คนอื่นทำ ฉันต้องหาวิธีแก้ปัญหาแบบไม่มีการเรียกซ้ำหรือไม่หรือฉันสามารถเพียงแค่ "สันนิษฐานว่าพื้นที่สแต็กอนันต์" ในกรณีเหล่านี้ได้หรือไม่? ฉันค่อนข้างแน่ใจว่าจะยุติภายในหนึ่งนาที