Re: Первый опыт с Nemerle
От: rameel https://github.com/rsdn/CodeJam
Дата: 17.08.07 20:47
Оценка:
Здравствуйте, SergASh, Вы писали:

[[ код поскипан ]]

SAS>А вопрос такой. Глянул я в рефлектор и обнаружил, что никакой там оптимизации хвостовой рекурcии нет и в помине, хотя как минимум одна из этих функций явный претендент на такую оптимизацию. Я что-то не так понял?


Чтобы получить хвостовую рекурсию код надо изменить примерно так:
using System.Console;
using System.IO;

module Applicaion
{
    DirectorySize(path : string) : long
    {
        DirectorySize(DirectoryInfo(path));
    }
    
    DirectorySize(directoryInfo : DirectoryInfo) : long
    {
        def files       = directoryInfo.GetFiles();
        def directories = directoryInfo.GetDirectories();
        
        DirectoryFilesSize(files) + 
        DirectorySubdirectoriesSize(directories);
    }
    
    DirectoryFilesSize(fileInfos : array[FileInfo], size: long = 0L, index : int = 0) : long
    {
        if (index < fileInfos.Length)
            DirectoryFilesSize(fileInfos, size + fileInfos[index].Length, index + 1);
        else 
            size;
    }
    
    DirectorySubdirectoriesSize(directoryInfos : array[DirectoryInfo], size: long = 0L, index : int = 0) : long
    {
        if (index < directoryInfos.Length)
            DirectorySubdirectoriesSize(directoryInfos, size + DirectorySize(directoryInfos[index]), index + 1);
        else 
            size;
    }

    Main() : void
    {
        def targetPath = @"D:\Temp";
        
        WriteLine($"Scanning $targetPath ...");
        def lengthInBytes : decimal = DirectorySize(targetPath);
        def lengthInMegaBytes = lengthInBytes    / 1024 / 1024;
        
        WriteLine("Directory size: {0:F1} Mb", lengthInMegaBytes);         
        WriteLine("\t{0} bytes", string.Format("{0:N}", lengthInBytes).Replace(".00", ""));
        WriteLine("Press any key to exit.");
        
        _ = ReadKey();
    }
}


ЗЫ. Re[2]: Nemerle и рекурсия
Автор: fmiracle
Дата: 24.07.06
... << RSDN@Home 1.2.0 alpha rev. 719 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.