递归问题

时间:2009-11-26 04:43:54

标签: c# c#-3.0 recursion

我需要将文件名与用户输入进行比较,并且必须显示匹配的文件。我正在使用递归函数。我将匹配的文件存储在列表中。但是当我返回列表时遇到问题。如何从递归调用的函数返回值?

5 个答案:

答案 0 :(得分:2)

您可以使用参数“返回”数据。例如:

public void MyRecursiveFunction(List<string> files, int depth)
{
    files.Add("...");
    if (depth < 10)
    {
        MyRecursiveFunction(files, depth + 1);
    }
}

答案 1 :(得分:0)

选项1(更好的方法):

您可以将字符串传递给递归方法,使用逗号将文件名追加到递归函数内的字符串,并在从内部调用递归函数时传递相同的字符串。更好的选择是使用StringBuilder而不是字符串。

选项2(不推荐):

您可能希望声明一个全局变量,函数会向其附加数据。

在这两个选项中,您可以使用List&lt;&gt;如果更合适。

答案 2 :(得分:0)

这是微不足道的;你设置一个退出案例:

function f (List m){
   if( y )
   {
       m.Add(k);
       return f(m);
   }

   return m;
}

答案 3 :(得分:0)

将列表作为参数传递。所有类都是“指针”,所以当它在func中被修改时,变化随处可见。如果我没有回答你的问题,那就是我几天前写的东西。

哎呀,这并没有显示传递列表。但是你基本上做了下面但是用一个列表而不是一个int?将列表作为参数传递。您也可以查找ref关键字,但这不是必需的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace DeleteWhenBelow
{
    class Program
    {
        static void Main(string[] args)
        {
            var dir = @"C:\Users\FixLoc\Documents\";
            var count = findAndDelete(dir, false, 1);
            Console.WriteLine(count);
        }
        static long findAndDelete(string folder, bool recurse, long filesize)
        {
            long count = 0;
            if(recurse)
            {
                foreach (var d in Directory.GetDirectories(folder))
                {
                    count += findAndDelete(d, recurse, filesize);
                }
            }
            foreach (var f in Directory.GetFiles(folder))
            {
                var fi = new FileInfo(f);
                if (fi.Length < filesize)
                {
                    File.Delete(f);
                    count++;
                }
            }
            return count;
        }
    }
}

答案 4 :(得分:0)

由于您使用的是C#3.0,因此可以使用LINQ来简化问题:

var expectedNames = getExpectedFilenames();
var matchingFiles = directoryInfo
                        .GetFileSystemInfos()
                        .SelectMany(fsi => fsi.GetFileSystemInfos())
                        .OfType<FileInfo>()
                        .Where(fi => expectedNames.Contains(fi.Name));

我还没有测试过上面的代码,因此可能需要进行一些调整...... GetFileSystemInfos将同时获取DirectoryInfo和FileInfo对象,然后使用SelectMany将相同的操作投射到每个返回的条目上。 SelectMany将展平层次结构。 OfType过滤掉目录。 Where根据投影中的每个文件名搜索预期文件名集。