Написал выполнение взаимной рекурсии без рекурсии на c#(trampoline из clojure)
Вчера мне при попытках разобраться с вложенной рекурсией посоветовали посмотреть на функцию trampoline в clojure. Для лучшего понимания я ее переписал на c#. Определение trampoline в clojure здесь (http://pramode.net/clojure/2010/05/08/clojure-trampoline/).
using System;
namespace Trampoline
{
class Program
{
static void Main()
{
//Console.WriteLine(FunA(100000));//stack overflow
Console.WriteLine(Trampoline(FunAT(100000)));
Console.ReadLine();
}
public static long FunA(long n)
{
return n == 0 ? 0 : FunB(n - 1);
}
private static long FunB(long n)
{
return n == 0 ? 0 : FunA(n - 1);
}
public static object FunAT(long n)
{
if (n == 0) return 0;
return new Func<object>(() => FunBT(n - 1));
}
private static object FunBT(long n)
{
if (n == 0) return 0;
return new Func<object>(() => FunAT(n - 1));
}
private static long Trampoline(dynamic result)
{
while (true)
{
if (result is Func<object>)
{
result = result.Invoke();
}
else
{
return result;
}
}
}
}
}
А теперь надо подумать поможет ли мне это с вложенной рекурсией по типу функции Аккермана.
Комментариев нет:
Отправить комментарий