C#; ลำดับ Fibonacci
มาต่อกับลำดับกันนะครับ Post นี้จะเกี่ยวข้องกับการสร้างลำดับ Fibonacci
เลข Fibonacci แต่ละตัวมาจากเลข 2 ตัวก่อนหน้าบวกกัน ซึ่งเลขลำดับแรกของ Fibonacci คือ 0 กับ 1 ดังนั้นเลขลำดับต่อมาคือ 1 (0+1) และถัดไปคือ 2 (1+1) เลข Fibonacci 20 อันดับแรก คือ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181
ลำดับ Fibonacci นี้มีคุณลักษณะพิเศษมากมาย เมื่อเอาเลข Fibonacci มาหารกับเลขก่อนหน้า f(i)/f(i-1) ผลลัพธ์จะเข้าใกล้ Golden Ratio เรื่อย ๆ โดยที่ Golden Ratio (Phi) มีค่าเท่ากับ 1.618034
ค่า Phi นี้ในแง่คณิตศาสตร์ มีคุณสมบัติพิเศษคือ Phi - 1 = 1 / Phi ดังนั้น Phi = 1 + 1 / Phi Phi = 1 + 1 / (1 + 1 / Phi) เมื่อแทนค่า Phi ไปเรื่อย ๆ จะทำให้เกิด Continued Fraction เป็นเลข 1 แบบไม่จำกัด
ลำดับ Fibonacci และ Golden Ratio นี้ ยังสามารถอธิบายลำดับและอัตราส่วนต่าง ๆ ในธรรมชาติ เช่น ความโค้งของเปลือกหอย Nautilus การเรียงตัวของเมล็ดดอกทานตะวัน และอัตราส่วนโครงสร้างของร่ายกายมนุษย์ ซึ่งตั้งแต่สมัย Renaissance ก็มีการศึกษาการใช้อัตราส่วนนี้ในการสร้างงานศิลปะและสถาปัตย์กรรม
นอกจากนี้เรายังสามารถสร้าง Pythagorean Triple ได้จากเลข Fibonacci โดยที่ f1, f2, f3, f4 คือเลข Fibonacci เรียงกัน 4 ตัว a = f1 x f4 b = 2 x f2 x f3 c = f22 + f32 แล้ว a2 + b2 = c2 เสมอ ตัวอย่าง นำเลข 1, 2, 3, 5 มา a = 1 x 5 = 5 b = 2 x 2 x 3 = 12 c = 22 + 32 = 13 ซึ่ง [5,12,13] เป็น Pythagorean Triple
ถ้าสนใจหาอ่านเพิ่มเกี่ยวกับ Fibonacci ได้ ที่นี่
คราวนี้เรามาเขียน Code Fibonacci กัน
public class Fibonacci : BaseSequence<BigInteger> { protected override IEnumerable<BigInteger> Enumerate() { BigInteger value = BigInteger.Zero; BigInteger value2 = BigInteger.One;
yield return value; yield return value2; while (true) { value += value2; yield return value; value2 += value; yield return value2; } } }
ง่ายไหมครับ ไม่กี่บรรทัดก็เขียนเสร็จแล้ว Code ข้างบนจำเป็นต้องใช้ Type จาก Post 2 อันก่อนหน้าด้วยนะครับ ซึ่งก็คือ BaseSequence กับ BigInteger
คราวนี้เราก็มาต่อกับการทำโจทย์ของ projecteuler.net กัน Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed one million. "หาผลรวมเลข Fibonacci ทุกตัวที่เป็นเลขคู่และมีค่าไม่เกิน 1 ล้าน"
Console.WriteLine( new Fibonacci().TakeWhile(x => x < 1000000).Where(x => x % 2 == 0).Sum() ); //1089154
What is the first term in the Fibonacci sequence to contain 1000 digits? "เลข Fibonacci ลำดับที่เท่าไหร่ ที่เป็นเลขตัวแรกที่มีค่ามากกว่า 1000 หลัก"
Console.WriteLine( new Fibonacci().TakeWhile(x => x.ToString(10).Length < 1000).Count() ); //4782
เรื่องของลำดับยังไม่จบครับ Post หน้าเรามาต่อเกี่ยวกับลำดับจำนวนเฉพาะ
* อ่านจบแล้ว กรุณา Comment ด้วยครับ เพื่อเป็น Feedback และเป็นกำลังใจ * บทความนี้คัดลอกได้ แต่ต้องมี Link หรือ Url กลับมาที่หน้านี้ และเมื่อคัดลอกแล้วกรุณา Comment แจ้งด้วยครับ
Create Date : 11 กรกฎาคม 2551 |
Last Update : 11 กรกฎาคม 2551 23:44:52 น. |
|
3 comments
|
Counter : 1931 Pageviews. |
|
|