Just algorithm!
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;
        }
    }
}


ง่ายไหมครับ Smiley
ไม่กี่บรรทัดก็เขียนเสร็จแล้ว
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.

 
ดีคะ แม้จะเข้าใจไม่หมดแต่ก็ได้ความรู้คะ


โดย: pj IP: 117.121.218.60, 117.121.208.2 วันที่: 26 พฤษภาคม 2552 เวลา:21:01:21 น.  

 
แหล่มๆๆๆ


โดย: ntbuilder IP: 182.53.4.202 วันที่: 31 ตุลาคม 2554 เวลา:23:02:26 น.  

 
ดีครับที่ให้ความรู้กับคนทั่วไปครับ


โดย: พุฒิ IP: 171.7.182.184 วันที่: 19 เมษายน 2559 เวลา:14:40:56 น.  

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 

chaowman
Location :
กรุงเทพฯ Thailand

[Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 8 คน [?]





New Comments
Group Blog
 
All Blogs
 
Friends' blogs
[Add chaowman's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.