C#避免回溯方法心得

所属分类: 软件编程 / C#教程 阅读数: 47
收藏 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# 字符串、数组和List的截取和转换实例

下面小编就为大家分享一篇C# 字符串、数组和List的截取和转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

c#打包文件解压缩的实例

下面小编就为大家分享一篇c#打包文件解压缩的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

下面小编就为大家分享一篇浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题,具有很好的参考价值,希望对大家有所帮助
收藏 0 赞 0 分享

判断一个整数是否是2的N次幂实现方法

下面小编就为大家分享一篇判断一个整数是否是2的N次幂实现方法,实例简洁,具有很好的参考价值。希望对大家有所帮助
收藏 0 赞 0 分享

浅谈c#中config.exe 引发的一些问题

下面小编就为大家分享一篇浅谈c#中config.exe 引发的一些问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

基于C#开发中的那些编码问题(详谈)

下面小编就为大家分享一篇基于C#开发中的那些编码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

C#实现WPS文件转PDF格式的方法示例

这篇文章主要介绍了C#实现WPS文件转PDF格式的方法,涉及C#针对office组件的相关引用与操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#实现的文件上传下载工具类完整实例【上传文件自动命名】

这篇文章主要介绍了C#实现的文件上传下载工具类,结合完整实例形式分析了C#操作文件上传与下载功能,并且还可针对上传文件自动命名以避免服务器中的文件名重复,需要的朋友可以参考下
收藏 0 赞 0 分享

C# Socket 发送&接收&返回 简单应用实例

下面小编就为大家分享一篇C# Socket 发送&接收&返回 简单应用实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多