четверг, 11 ноября 2010 г.

Написал выполнение взаимной рекурсии без рекурсии на 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;

                }

            }

        }

 

    }

}

 

А теперь надо подумать поможет ли мне это с вложенной рекурсией по типу функции Аккермана. 

 

Комментариев нет:

Linux.org.ru News

Вебпланета - все новости

CNews - Издание о высоких технологиях