Loading...
+ Нов въпрос
konstantin_zarev93 avatar konstantin_zarev93 0 Точки

Задача: Fibonacci

Къде е грешката в кода ми задачата е:  

0.Числа на Фибоначи

Напишете програма, която въвежда цяло число n и пресмята n-тото число на Фибоначи. Нулевото число на Фибоначи е 1, първото е също 1, а всяко следващо е сумата от предходните две. Примери:

вход

изход

 

вход

изход

 

вход

изход

 

вход

изход

 

вход

изход

0

1

1

1

2

2

5

8

10

89

 

using System;

namespace ConsoleInputOutput
{
    public static class Fibonachi
    {
        public static void Main()
        {
            int n = int.Parse(Console.ReadLine());
            if (n < 1) Console.WriteLine(0);
            else
            {
                int first = 0;
                int second = 1;
                Console.WriteLine(first);
                Console.WriteLine(second);
                int  third = 0;
                for (int i = 2; i < n; i++)
                {
                    third = first + second;
                    Console.Write(third + " ");
                    first = second;
                    second = third;
                }
            }
        }
    }
}

 

Тагове:
0
Programming Basics 02/12/2016 11:10:42
SPPetrov avatar SPPetrov 43 Точки

Здравей,

тъй като F(0)=1 ,то тогава при if (n < 1) Console.WriteLine(1);

и тук е същото F(0)=1, то тогава и int first = 1

0
29/11/2016 22:34:31
Alex0101 avatar Alex0101 374 Точки

Всъщност по условие би следвало да разпечаташ само 1 число - п-тото.

Трябва да намериш редицата и да печаташ, след като условията за цикъл са сработили и си излезнал от него.

Поне аз така бих направил. На всяка итерация изчислявам текущото число, и след като излезна от цикъла , печатам последното текущо число.

0
morgan avatar morgan 30 Точки

По условие нулевото число на Фибоначи е 1, а не 0 (в твоя код е int first = 0;). Така още на 3-ото число ти се губи редицата. То трябва да е 1+1 = 2, а при теб е 1 (third = first + second;). И т.н.

0
Martin.T avatar Martin.T 35 Точки

Въпросът е голям спор и да колегата е прав числата при Фибоначи започват от 1,1,2 т.н. Може и от 0 но алгоритъма се променя малко не е грешен защото 0 + 1 = 1 и 0 + 0 = 0 но това е др. тема :)

0
g_todorov avatar g_todorov 106 Точки

Здравей konstantin_zarev93,

Ето и моето решение:

Преди да погледнеш кода виж тоя ред на Фибоначи в .pptx презентацията научи логиката и после го разпиши на лист хартия  - така ще вникнеш познавателно в логиката на сорс-кода.

Първоначално променливите var f0=1 и varf1=1, защото им се присвояват стойностите на първите представители от реда на Фибоначи.

Да резгледаме пример с n = 3; 

1-во завъртане на цикъла:

В for цикъла стойностите на променливите f0=1(първоначално) и f1=1(първоначално) се сумират, като променливата result  присвоява стойността от сбора (result=2

f0 присвоява стойността на f1 - в случая си съвпадат (f0=1),

 а стойността на f1 се презаписва (f1=2) с тази на току що появилия се сбор в променливата result, а

2-ро завъртане на цикъла:

Променливата result се презаписва (result = 3) със стойността от сбора на (f0=1) и  (f1=2) 

f0 се презаписва и присвоява предната стойност на f1 (f0=2)

f1 се презаписва и присвоява стойността на result (f1=3)

С този оборот цикълът приключва, защото оборотите трябва да са  i<n-1 (3-1 = 2) със Start от 0 

включително - тоест оборотите са 2 и конзолата изписва f1 с последно присвоената му стойност (f1=3). Може да копираш тоя код и да го поставиш директно между къдравите скоби в един нов проект и с дебъгера да проиграеш как работи с различни стойности за n.

Успех!

            var n = int.Parse(Console.ReadLine());
            var f0 = 1;
            var f1 = 1;
            for (int i = 0; i < n-1; i++)
            {
                var result = f0 + f1         
                f0 = f1;

                f1 = result; 
            }                     //ako n = 0, togava ne vliza v cikul, a napravo izpisva purvona4alnata stoinost na f1
            Console.WriteLine(f1);

0
cvetomirG avatar cvetomirG 132 Точки

Тук  е момента да погледнете рекурсията, за да се убедите колко лесно се работи рекурсивно специално подобни задачи.

 

1
Ivanov.Ivan avatar Ivanov.Ivan Trainer 558 Точки

И колко неподходяща е за този проблем. Като при рекурсивното решение без memoization, ако трябва да изчислим F(7) => F(5) се изчислява 2 пъти, F(4) => 3 пъти, F(2) => 8 пъти и т.н. Представи си ако трябва да изчислим F(45) какво се случва. 

0
cvetomirG avatar cvetomirG 132 Точки

Не се изразих много окей. Че е бавна, бавна е, но фибоначи е перфектната задача за да се разбере рекурсията.

 

1
Ivanov.Ivan avatar Ivanov.Ivan Trainer 558 Точки

Да. Мога да се съглася, че е една от задачите с които може да се демонстрира рекурсията :)

0
06/12/2016 17:17:22
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.