Tag: 递归

是否可以实现递归“SelectMany”?

众所周知, Enumerable.SelectMany将一系列序列展平为单个序列。 如果我们想要一种能够使序列序列序列变平,等等递归的方法怎么办? 我很快就得到了一个使用ICollection ,即热切评估,但我仍然在考虑如何使用yield关键字制作一个懒惰评估的实现。 static List Flatten(IEnumerable list) { var rv = new List(); InnerFlatten(list, rv); return rv; } static void InnerFlatten(IEnumerable list, ICollection acc) { foreach (var elem in list) { var collection = elem as IEnumerable; if (collection != null) { InnerFlatten(collection, acc); } else { acc.Add((T)elem); } } } 有任何想法吗? 任何.NET语言欢迎中的示例。

.NET,C#,Reflection:列出字段的字段,字段本身具有字段

在.NET和C#中,假设ClassB有一个ClassA类型的字段。 可以使用方法GetFields轻松列出ClassB的字段。 但是,我还想列出那些本身有字段的ClassB字段的字段。 例如, ClassB的字段x具有字段b , s和i 。 我想(以编程方式)列出这些字段(正如我在以下代码中的评论所建议的那样)。 class ClassA { public byte b ; public short s ; public int i ; } class ClassB { public long l ; public ClassA x ; } class MainClass { public static void Main ( ) { ClassA myAObject = new ClassA () ; ClassB […]

运行时exception,递归太深

我将伪代码转换为C#,并以递归方式重复10,000次。 但是在9217次之后我收到了C#运行时错误, StackOverflow Exception 。 我怎么能阻止这个? 编辑如果它对任何人有帮助,这里是代码: private double CalculatePi(int maxRecursion) { return 2 * CalculatePi(maxRecursion, 1); } private double CalculatePi(int maxRecursion, int i) { if (i >= maxRecursion) return 1; return 1 + i / (2.0 * i + 1) * CalculatePi(maxRecursion, i + 1); } double pi = CalculatePi(10000); // 10,000 recursions EDIT2所以每个人似乎都同意我需要将其转换为迭代…任何人都可以提供一些代码吗? […]

C#编译与尾递归优化?

基于丰富的stackoverflow,我一直在研究是否对特定的c#代码进行尾递归优化。 一些问题似乎在讨论 推测正在发布的更新版本的.net中的优化 构建应用程序作为x64bit应用程序来实现优化 在Visual Studio中从调试版本切换到发布版本以实现优化 根本没有优化,并且微软社区声称他们不会对“安全问题”进行尾递归优化(实际上并不理解这个问题) 它是随机发生的 从C#4.0(Visual Studio 2013/2015)开始,如果可以确保尾递归优化,如何确保尾递归优化呢?

在C#中,在算法中使用递归函数是一种好习惯吗?

在许多使用递归的函数语言中被认为是一种很好的实践。 我认为这很好,因为编译器优化了函数式语言的代码。 但是在创建算法时,在C#中使用递归是一种好习惯吗? 就C#而言,是否正确,递归算法将导致您的堆栈增长非常显着(如果调用量非常大)并且这根本不会快,并且可能导致堆栈溢出。 或者还有一些优化可以使递归函数高效? 如果您在使用函数语言中的递归和C#的算法之间进行一些比较(速度,内存,可读性),我将不胜感激。

获取目录大小的更有效方法

我已经构建了一个递归函数来获取文件夹路径的目录大小。 它的工作原理,但随着我必须搜索的目录数量不断增加(以及每个相应文件夹中的文件数量),这是一种非常缓慢,低效的方法。 static string GetDirectorySize(string parentDir) { long totalFileSize = 0; string[] dirFiles = Directory.GetFiles(parentDir, “*.*”, System.IO.SearchOption.AllDirectories); foreach (string fileName in dirFiles) { // Use FileInfo to get length of each file. FileInfo info = new FileInfo(fileName); totalFileSize = totalFileSize + info.Length; } return String.Format(new FileSizeFormatProvider(), “{0:fs}”, totalFileSize); } 这是在所有子目录中搜索参数路径,因此dirFiles数组变得非常大。 有没有更好的方法来实现这一目标? 我已经四处寻找,但还没有找到任何东西。 我想到的另一个想法是将结果放入缓存中,当再次调用该函数时,尝试查找差异并仅重新搜索已更改的文件夹。 不确定这是不是一件好事……

在C#中递归打印一串斐波那契

没有while循环可以做到吗? static void Main(string[] args) { Console.WriteLine(“Please enter a number”); int number = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(” #” + Fibonacci(number)); } public static int Fibonacci(int number) { if (number <= 1) { return 1; } else { return Fibonacci(number – 2) + Fibonacci(number – 1); } } 我甚至无法在基本案例的主体中添加Console.WriteLine ,因为它被执行[次数]次数; 不知道怎么做没有循环…

为什么这个明显的无限递归没有给出编译器警告?

几个月前,我不得不修复一些导致一些问题的代码。 代码看起来基本上是这样的: int badFun() { return badFun(); } 这显然导致了堆栈溢出,即使在我正在使用的高级语言中(SilkTest中的4Test)。 这段代码无法被视为有益。 问题的第一个迹象是脚本完成后看到的警告,但没有编译错误或警告。 奇怪的是,我尝试用C ++,C#和Python编写具有相同结构的程序,并且所有这些程序都编译/解释时没有语法错误或警告,即使在所有情况下都存在运行时错误。 在任何这些情况下我都没有看到任何警告。 为什么默认情况下这不是一个可能的问题? 编辑:我尝试用所有三种语言编写相应的函数,所以我添加了这些函数标签。 我对代码这样的代码没有任何警告的整体原因更感兴趣。 如有必要,请重新登记。

如何进行递归搜索?

我有一个Task类,它可以有相同类型的子任务 public class Task { public DateTime Start { get; set;} public DateTime Finish { get; set;} public List Tasks {get; set;} public DateTime FindTaskStartDate(Task task) {} } 我应该如何执行递归搜索(也许linq)以找到具有最早开始日期的任务? 我最初的方法涉及太多的循环,它结束了一点点混乱,并迅速失控。 这是我的第二次尝试: public DateTime FindTaskStartDate(Task task) { DateTime startDate = task.Start; if(task.HasSubTasks()) { foreach (var t in task.Tasks) { if (t.Start < startDate) { startDate = […]

检测C#代码中的递归调用

我想在我的代码中找到所有递归调用。 如果我在Visual Studio中打开文件,我会在编辑器的左侧看到“递归调用”图标。 我想检查这些电话的整个解决方案。 我使用Resharper命令行工具和VS的加载项Resharper – 代码检查没有运气,此规则未应用于其规则集。 有什么办法可以检查整个解决方案 – 我真的不想打开每个文件并检查那个蓝色的“递归调用”图标:) 编辑:我对单级递归很感兴趣