พิจารณาปัญหาเก่าที่รู้จักกันดี :
ในทางคณิตศาสตร์ตัวหารร่วมที่ยิ่งใหญ่ที่สุด (gcd) …ของจำนวนเต็มที่ไม่ใช่ศูนย์ตั้งแต่สองตัวขึ้นไปเป็นจำนวนเต็มบวกที่ใหญ่ที่สุดที่หารจำนวนโดยไม่เหลือเศษ
คำจำกัดความของ gcd นั้นง่ายอย่างน่าประหลาดใจ:
โดยที่ mod เป็นตัวดำเนินการโมดูโล (นั่นคือส่วนที่เหลือหลังจากการหารจำนวนเต็ม)
ในภาษาอังกฤษคำนิยามนี้กล่าวว่าตัวหารร่วมมากของจำนวนใด ๆ และเป็นศูนย์เป็นจำนวนนั้นและตัวหารร่วมมากของตัวเลขสองmและnเป็นตัวหารร่วมมากของnและส่วนที่เหลือหลังจากการหารเมตรโดยn
หากคุณต้องการที่จะรู้ว่าทำไมงานนี้ให้ดูที่บทความวิกิพีเดียในขั้นตอนวิธี Euclidean
ลองคำนวณ gcd (10, 8) เป็นตัวอย่าง แต่ละขั้นตอนจะเท่ากับขั้นตอนก่อนหน้า:
- gcd (10, 8)
- gcd (10, 10 สมัย 8)
- gcd (8, 2)
- gcd (8, 8 สมัย 2)
- gcd (2, 0)
- 2
ในขั้นตอนแรก 8 ไม่เท่ากับศูนย์ดังนั้นส่วนที่สองของคำจำกัดความจะใช้ 10 mod 8 = 2 เพราะ 8 ไปหาร 10 ครั้งเดียวโดยเหลือ 2 ในขั้นตอนที่ 3 ส่วนที่สองจะใช้อีกครั้ง แต่คราวนี้ 8 mod 2 = 0 เพราะ 2 หาร 8 โดยไม่มีส่วนที่เหลือ ในขั้นตอนที่ 5 อาร์กิวเมนต์ที่สองคือ 0 ดังนั้นคำตอบคือ 2
คุณสังเกตเห็นว่า gcd ปรากฏทั้งด้านซ้ายและด้านขวาของเครื่องหมายเท่ากับหรือไม่? นักคณิตศาสตร์จะบอกว่าคำจำกัดความนี้เป็นแบบวนซ้ำเนื่องจากนิพจน์ที่คุณกำหนดให้เกิดซ้ำภายในนิยามของมัน
คำจำกัดความแบบวนซ้ำมักจะสวยหรู ตัวอย่างเช่นคำจำกัดความแบบวนซ้ำสำหรับผลรวมของรายการคือ
sum l =
if empty(l)
return 0
else
return head(l) + sum(tail(l))
head
องค์ประกอบแรกในรายการอยู่ที่ไหนและtail
เป็นส่วนที่เหลือของรายการ โปรดทราบว่าsum
เกิดซ้ำภายในคำจำกัดความในตอนท้าย
บางทีคุณอาจต้องการค่าสูงสุดในรายการแทน:
max l =
if empty(l)
error
elsif length(l) = 1
return head(l)
else
tailmax = max(tail(l))
if head(l) > tailmax
return head(l)
else
return tailmax
คุณอาจกำหนดการคูณของจำนวนเต็มที่ไม่เป็นลบซ้ำ ๆ เพื่อเปลี่ยนเป็นชุดของการเพิ่ม:
a * b =
if b = 0
return 0
else
return a + (a * (b - 1))
หากการแปลงการคูณเป็นชุดของการเพิ่มนั้นไม่สมเหตุสมผลให้ลองขยายตัวอย่างง่ายๆเพื่อดูว่ามันทำงานอย่างไร
การเรียงลำดับผสานมีคำจำกัดความแบบวนซ้ำที่น่ารัก:
sort(l) =
if empty(l) or length(l) = 1
return l
else
(left,right) = split l
return merge(sort(left), sort(right))
คำจำกัดความแบบวนซ้ำอยู่รอบตัวหากคุณรู้ว่าจะหาอะไร สังเกตว่าคำจำกัดความเหล่านี้ทั้งหมดมีกรณีฐานอย่างง่ายเช่น gcd (m, 0) = m กรณีที่เกิดซ้ำจะลดลงที่ปัญหาเพื่อหาคำตอบที่ง่าย
ด้วยความเข้าใจนี้คุณสามารถชื่นชมอัลกอริทึมอื่น ๆ ในบทความของ Wikipedia เรื่องการเรียกซ้ำได้แล้ว !