C#避免回溯方法心得

所属分类: 软件编程 / C#教程 阅读数: 75
收藏 0 赞 0 分享

本文实例讲述了C#避免回溯方法,分享给大家供大家参考之用。具体分析如下:

首先,回溯法是不可控的,有时候会超出我们意料之外产生不妙的结果,最常见的也就是内存泄漏。。

回溯方法是很容易想到,又不容易想到的,往往,我们思维更容易进入的是回溯法。但是回溯法有着它的弊端,非常明显的弊端是作用域内产生的变量和引用在回溯法调用未完成时,不能释放(对于大部分编辑器来说,排除有着优化能力的编辑器)。如果我们在某一方法中使用极多的回溯调用,在方法中不能及时的对方法作用域内的变量和引用释放,最终会造成内存不足和cpu的计算负荷增大(内存机制中可以将过剩的数据转存到虚拟内存、硬盘,这个就不说了)。使用栈(队)式的循环,可以轻易避免回溯法,而且栈(队)式的数据再使用之后可以很方便的抛出移除。某些时候就是这样,一个小小的改动,可以让一个程序在某种特定的环境中起死回生。(之前做过一个数独运算器的算法,后来的优化改进就是为了避免回溯)

示例代码如下:

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

namespace 避免回溯方法
{
  class Program
  {
    static void Main(string[] args)
    {
      string path = AppDomain.CurrentDomain.BaseDirectory;

      List<string> fileList1 = new List<string>();
      FunctionHuishuo(path, ref fileList1);

      List<string> fileList2 = new List<string>();
      FunctionQueue(path, ref fileList2);

      List<string> fileList3 = new List<string>();
      FunctionStack(path, ref fileList3);
    }

    /// <summary>
    /// 回溯法
    /// </summary>
    /// <param name="path"></param>
    /// <param name="fileList"></param>
    private static void FunctionHuishuo(string path, ref List<string> fileList)
    {
      if (true)
      {
        string[] files = null;
        try
        {
          files = Directory.GetFiles(path);
        }
        catch { }

        if (files != null && files.Length > 0)
        {
          fileList.AddRange(files);
        }
      }

      if (true)
      {
        string[] folders = null;
        try
        {
          folders = Directory.GetDirectories(path);
        }
        catch { }

        if (folders != null && folders.Length > 0)
        {
          foreach (string folder in folders)
          {
            FunctionHuishuo(folder, ref fileList);
          }
        }
      }
    }

    /// <summary>
    /// 堆栈法
    /// </summary>
    /// <param name="path"></param>
    private static void FunctionStack(string path, ref List<string> fileList)
    {
      Stack<string> stack = new Stack<string>();
      stack.Push(path);

      while (stack.Count > 0)
      {
        string dir = stack.Pop();

        string[] files = null;
        try
        {
          files = Directory.GetFiles(dir);
        }
        catch { }

        if (files != null && files.Length > 0)
        {
          fileList.AddRange(files);
        }

        string[] folders = null;
        try
        {
          folders = Directory.GetDirectories(dir);
        }
        catch { }

        if (folders != null && folders.Length > 0)
        {
          foreach (string folder in folders)
          {
            stack.Push(folder);
          }
        }
      }
    }

    /// <summary>
    /// 队列法
    /// </summary>
    /// <param name="path"></param>
    private static void FunctionQueue(string path, ref List<string> fileList)
    {
      Queue<string> queue = new Queue<string>();

      queue.Enqueue(path);

      while (queue.Count > 0)
      {
        string dir = queue.Dequeue();

        string[] files = null;
        try
        {
          files = Directory.GetFiles(dir);
        }
        catch { }

        if (files != null && files.Length > 0)
        {
          fileList.AddRange(files);
        }

        string[] folders = null;
        try
        {
          folders = Directory.GetDirectories(dir);
        }
        catch { }

        if (folders != null && folders.Length > 0)
        {
          foreach (string folder in folders)
          {
            queue.Enqueue(folder);
          }
        }
      }
    }
  }
}

请仔细对比下三种循环结构的写法,特别注意下里面有用到  if(true){...}   ,这种方式在某些编辑环境中可以产生非常美妙的效果。

相信本文所述对大家C#程序设计的学习有一定的借鉴价值。

更多精彩内容其他人还在看

C#抽象类与抽象方法详解

这篇文章主要为大家详细介绍了C#抽象类与抽象方法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C#代码实现扑克牌排序的几种方式

今天小编就为大家分享一篇关于C#代码实现扑克牌排序,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#泛型概念的简介与泛型的使用

今天小编就为大家分享一篇关于C#泛型概念的简介与泛型的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C# 7.0 使用下划线忽略使用的变量的原因分析

这篇文章主要介绍了C# 7.0 使用下划线忽略使用的变量的原因浅析,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C# 中使用正则表达式匹配字符的含义

正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

C# Dictionary和SortedDictionary的简介

今天小编就为大家分享一篇关于C# Dictionary和SortedDictionary的简介,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#中SQL Command的基本用法

今天小编就为大家分享一篇关于C#中SQL Command的基本用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#使用SQL DataReader访问数据的优点和实例

今天小编就为大家分享一篇关于C#使用SQL DataReader访问数据的优点和实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#使用SQL Dataset数据集代码实例

今天小编就为大家分享一篇关于的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

C#使用SQL DataAdapter数据适配代码实例

今天小编就为大家分享一篇关于C#使用SQL DataAdapter数据适配代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享
查看更多