บทที่ 7 รีเคอร์ซีฟ ระหว่างการออกแบบเขียนโปรแกรมแบบบนลงล่าง (Top-down Design) จะมีงานย่อย(Subtask) เพื่อแก้ปัญหาในแต่ละเรื่อง และผู้เขียนโปรแกรมต้องการใช้งานย่อยในลักษณะที่เรียกตัวเองขึ้นมาทำงานลักษณะของฟังก์ชั่นมีความรอบรัดสั้นกว่าแบบวนลูป ซึ่งเป็นการตรวจสอบกฎเกณฑ์ที่กำหนดขึ้นมาทางคณิตศาสตร์ กำหนดให้มีการเรียกตัวเองขึ้น
รีเคอร์ซีฟ(ต่อ) การทำงานประกอบด้วย 2 ส่วนคือ 1. กรณีพื้นฐาน (Base Case) เป้นส่วนที่ค่าของฟังก์ชันสอดคล้องหรือเท่ากับค่าของพารามิเตอร์ที่ส่งมาหรือปัญกาได้ถูกต้องแก้ไขเพียงพอแล้ว ไม่มีการเรียกตัวเองขึ้นมาทำงานอีก
รีเคอร์ซีฟ(ต่อ) 2. เรียกตัวเอง (Recursive Call) เป็นส่วนที่ค่าของฟังก์ชันที่ถูกเรียกนำมาใช้กับค่าของพารามิเตอร์ที่ส่งมาหรือปัญหายังแก้ไขไม่เพียงพอ จะต้องเรียกตัวเองขึ้นมาทำงานต่อไปจนกว่าจะได้เป็นกรณีพื้นฐานจึงจบการทำงาน
2 * 24 2 * 23 ขั้นตอนการเรียกตัวเองทำงานของการหาค่าเลขยกกำลัง โจทย์ 2^5 2 * 24 ครั้งที่ 1 2 * 23 ครั้งที่ 2
2 * ครั้งที่ 3 * 22 2 * ครั้งที่ 4 * 2 21
2 * * 2 ครั้งที่ 5 20
2 * * 2 ครั้งที่ 6 2 = 1
2 * * 2 2 = 1 ขั้นตอนการถอยกลับทางเมของการหาค่าเลขยกกำลัง โจทย์ 2^5 โจทย์ 2^5 * 2 ครั้งที่ 1 2 = 1
2 * * 2 ครั้งที่ 2 20
2 * ครั้งที่ 3 * 2 21 2 * ครั้งที่ 4 * 22
2 * 23 ครั้งที่ 5 2 * 24 ครั้งที่ 6
การทำงานของฟังก์ชัน Power #include <iostream.h> double power(double x,int n){ --ประกาศตัวแปรเป็น double และ int if(n==0) return 1; --คำสั่งการตรวจสอบถ้า n เท่ากับ 0 ให้ส่งค่ากลับมาเป็น 1
--ให้ส่งค่ากลับมาโดยให้ตัวแปร x คูณกับเลขยกกำลังคือ x และ else return x*power(x,n-1); --ให้ส่งค่ากลับมาโดยให้ตัวแปร x คูณกับเลขยกกำลังคือ x และ n-1 หรือนำค่า x แล้วนำค่าตัวแปรxมาเลขยกกำลังกับตัวแปร n } ตัวอย่าง Input Base Number : 3 Input n Number : 5 Power of 3^5:243
int main() { int x,n; --ประกาศตัวแปรเป็นชนิด int 2 ตัวคือ x,n
cout<<"Input Base Number:"; cin>>x; --รับค่าเข้าตัวแปร x cout<<"Input n Number:"; --แสดงค่า Input n Number
cin>>n; --รับค่าเข้าตัวแปร n cout<<"Power of"<<x<<"^"<<n<<":"<<power(x,n)<<endl; --แสดงค่า Power of แล้วนำตัวแปร x ,^,n และ : --นำค่าทั้ง 2 ตัวคือ x และ n มายกกำลัง return 0; }
รับค่า n = 5; เข้ามาเก็บไว้ในหน่วยความจำ Memory กำหนดค่าให้ตัวแปร x=2; และ n=5;
การหาตัวเลขไฟโบแนคซี (Fibonacci Number) ฟังก์ชันรีเคอร์ซีฟ การทำงานในส่วนเรียกตัวเองให้ขึ้นมาจะมีการเรียกเพียงครั้งเดียว แต่บางฟังก์ชันอาจต้องมีการเรียกตัวเองขึ้นมาทำงานได้มากกว่าหนึ่งครั้ง การหาตัวเลขไฟโบแนคซี (Fibonacci Number) หมายถึง การนำค่าเริ่มต้น คือ 0 กับ 1 จากนั้นเลขถัดไปจะ เท่ากับเลขก่อนหน้าสองตัวบวกกัน
long fibonacci(int n) --ประกาศค่า long มีชื่อว่า fibonacci ให้มีชนิดเป็น int มีตัวแปรชื่อว่า n if(n<1) return 0; --โดยมีเงื่อนไขว่าถ้า n น้อยกว่า 1 ให้แสดงค่าเป็น 0
if(n==1) return 1; --ถ้า n เท่ากับ1ให้แสดงค่า 1 else return fibonacci(n-1)+fibonacci(n-2); --หรือให้แสดงค่า n ลบ 1 บวกกับ n ลบ2
ตัวอย่าง ครั้งที่ 1 1 = ครั้งที่ 2 1 2 = 3 ครั้งที่ 3 2 3 = 5
ครั้งที่ 4 3 5 = 8 ครั้งที่ 5 5 8 = 13 ครั้งที่ 6 8 13 = 21
ฟังก์ชันการหาค่าตัวเลขไฟโบแนคซีแบบวนลูป long fiboI(int n){ --ประกาศค่า long มีชื่อว่า fiboI ให้มีชนิดเป็น int มีตัวแปรชื่อว่า n int i,f0,f1,f2; --ประกาศตัวแปรเป็นชนิดint 4 ตัว คือ i, f0, f1, f2
if(n<1) return 0; --มีเงื่อนไขว่าถ้า n มากกว่า 1 ให้แสดง 0 if(n<3) return 1; --แต่ถ้า n มากกว่า 3 ให้แสดง 1 f0=1; --โดยกำหนดให้ f1 มีค่าเท่ากับ 1 f1=1 --โดยกำหนดให้ f1 มีค่าเท่ากับ 1
for(i=3;i<=n;i++) { f2=f1+f0; f0=f1; --โดยกำหนดให้ f2 เท่ากับ f1 บวก f0 --แล้วให้ f0 เท่ากับ f1
f1=f2; --แล้วให้ f1 เท่ากับ f2 } return f2; --ให้ส่งค่าและแสดงค่า f2 คือ 7
f0 =5; f1 =2; f0 5 f1 2 f0 + f1 = f2 5 + 2 = 7 โดยให้ส่งค่าและแสดงค่าF2
= = = = f0 f1 ดังนั้น f0 จะมีค่าเท่ากับ 0 และ f1 จะมีค่าเท่ากับ 5 5 f1
ฟังก์ชันการหาค่าตัวเลขไฟโบแนคซีแบบใช้พื้นที่เพิ่ม long fiboM(int n){ --ประกาศค่า long มีชื่อว่า fiboM ให้มีชนิดเป็น int มีตัวแปรชื่อว่า n int i; --ประกาศตัวแปรเป็นชนิด int โดยกำหนดให้ชื่อ i
long F[100]; --ประกาศตัวแปรเป็นชนิด long โดยกำหนดให้ชื่อ F มีการจองพื้นที่ไว้100 if(n<1) return 0; --มีเงื่อนไขว่าถ้า n มากกว่า 1 ให้แสดง 0 if(n<3) return 1; --แต่ถ้า n มากกว่า 3 ให้แสดง 1
F[1]=1; --โดยกำหนดให้ F[1] เท่ากับ 1 F[2]=1; --โดยกำหนดให้ F[2] เท่ากับ 1 for (i=3;i<=n;i++) { --โดยเงื่อนไขว่าให้ i เท่ากับ 3 แล้วให้ i มากกว่าหรือเท่ากับ n และให้ i++
F[i]=F[i-1]+F[i-2]; --โดยให้ F[i] เท่ากับ F[i-1] บวก F[i+2] return F[n]; --ส่งค่าและแสดงค่า F[n] }
5 2 + = + = 7 F[i-1] =5; F[i-2] =2; f0 f1 F[i-1] F[i-2] F[i] 5 2