это функциональный стиль. может в том проблема? попробуйте тот же C#? Си? (без плюсов для начала).. любой диалект Pascal?
... это именно что бы понять.. а так, против питона ни че личного ))
разглядел теги... ща.. дабавлю..
изучите легкую модификацию алгоритма.. ну и проще с хранилищем, чем сразу с рекурсией.. просили же на пальцах? ;))namespace ConsoleApp1
{
public static class Fib
{
static List<int> fib = new List<int>();
static int max = 15;
public static void Main()
{
for (var i = 0; i < max; i++)
{
if (i == 0) fib.Add(0);
else if (i == 1) fib.Add(1);
else fib.Add(fib[i - 1] + fib[i - 2]);
fib.print();
"... next step...".print();
}
}
public static void print(this string s) => Console.WriteLine(s);
public static void print(this List<int> l) { foreach (var i in l) i.ToString().print(); }
}
}
- функциональный стиль крут лаконичностью....
- слаб не предсказуемостью времени выполнения (а так же рисками переполнения стека..
- изучите что такое
хвостовая рекурсия.. (после того как разберетесь с моей версией... ;)))... удачи
.. ну или так еще..namespace ConsoleApp1
{
public static class Fib
{
static List<int> fib = new List<int>();
static int max = 15;
public static void Main()
{
fib.Add(0);
fib.Add(1);
for (var i = 2; i < max; i++)
{
fib.Add(fib[i - 1] + fib[i - 2]);
fib.print();
"... next step...".print();
}
}
public static void print(this string s) => Console.WriteLine(s);
public static void print(this List<int> l) { foreach (var i in l) i.ToString().print(); }
}
}
нарушения сна.. надо чем то заняться ))
.. и так, рекурсия мощный инструмент.. но особенно когда мы знаем некие принципы по кускам, а связать их нам трудно (привет Prolog ;)...
беру ваш исходный пример, и добавляю трассировку ;)namespace ConsoleApp2
{
public static class recursion
{
static long callcnt = 0;
static int fib(int n)
{
$"_fib calling {++callcnt} count".print();
var res = 0;
if (n == 0 || n == 1) res = n;
else res = fib(n - 1) + fib(n - 2);
$"_fib return {res}".print();
return res;
}
static int max = 15;
public static void Main()
{
for (var i = 0; i < max; i++)
{
"... next fib...".print();
fib(i).ToString().print();
}
}
public static void print(this string s) => Console.WriteLine(s);
public static void print(this List<int> l) { foreach (var i in l) i.ToString().print(); }
}
}
.. реализуйте, и сравните как растет
стоимость выполнения с ростом глубины погружения (номера числа Фибоначчи).. оптимизацию для одного вызова не применял.. так нагляднее )))
.. тем не менее, иногда рекурсия и красивый, и надежный способ решения запутанных задач )))
.. но, возможно, дорогой по времени и ресурсам )))
... еще подправил, подумал так нагляднее ;)))... программируйте, пробуйте все ))