Здравствуйте, 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 >>