C# :: Aufgabe #182 :: Lösung #1

4 Lösungen Lösungen öffentlich
#182

Mononacci, Fibonacci, Multinacci

Anfänger - C# von hollst - 09.07.2017 um 12:16 Uhr
Die Fibonacci-Folge beginnt bekanntlich mit {1, 1}, also zwei Einsen
und jedes Folgeglied ist die Summe seiner zwei Vorgänger. Wir wollen die Fibonacci-Folge wegen der zwei Starteinsen "fibo2" nennen.

Unter einer Multinacci-Folge (fibok) sei eine Folge verstanden, die mit k Einsen beginnt
und jedes Folgeglied die Summe der k Vorgängerglieder ist. Ist k = 1, so heiße der Spezialfall Mononacci.

Die Glieder der Multinacci-Folgen werden ab Glied k immer größer und streben gegen unendlich.
Allerdings strebt der Quotient zweier benachbarter Folgeglieder immer gegen einen endlichen Grenzwert, bei fibo2
ist es bekanntlch der goldene Schnitt phi (phi = 1.618034).

Wir wollen den entsprechenden Grenzwert der Multinacci-Folgen mit "phi_fibok" benennen.

Schreibe ein Programm, das für k = 1, 2, 3 ... 100 die ersten 10 Glieder der Multinacci-Folgen ab Glied k und den Grenzwert phi_fibok ausgibt.

Hinweis: Beider der Grenzwertbildung könnt ihr es mit sehr große Zahlen zu tun bekommen, deshalb Ergebnis auf Plausibilität testen!
#1
vote_ok
von daniel59 (4260 Punkte) - 08.08.2017 um 09:01 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleMultinacci
{
    static class Program
    {
        static void Main(string[] args)
        {
            Console.BufferHeight = 1000;
            for (int i = 1; i <= 100; i++)
            {
                var multinacci = GetMultinacci(i, 50).Skip(i);
                foreach (var item in multinacci.Take(10))
                {
                    Console.Write($"{item} ");
                }
                Console.WriteLine();
                Console.WriteLine($"phi_fibo{i}: {multinacci.GetPhi()}\r\n");
            }
            Console.ReadLine();
        }

        static List<decimal> GetMultinacci(int k, int length)
        {
            List<decimal> multinacci = new List<decimal>();
            for (int i = 0; i < k; i++)
            { multinacci.Add(1); }

            multinacci.Skip(0).Take(k);
            multinacci.AddNextMultinacciNumber(0, k, length);

            return multinacci;
        }

        static void AddNextMultinacciNumber(this List<decimal> multinacci, int index, int k, int length)
        {
            var fn = multinacci.Skip(index).Take(k);
            decimal num = 0;
            foreach (decimal bi in fn)
            {
                num += bi;
            }
            multinacci.Add(num);
            if (index < length)
            {
                multinacci.AddNextMultinacciNumber(index + 1, k, length);
            }
        }

        static decimal GetPhi(this IEnumerable<decimal> multinacci)
        {
            var end = multinacci.Skip(multinacci.Count() - 2);
            return (end.Last() / end.First());
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben