请教"递归算法"

sdcer 2003-10-16 04:51:40
以前我学过数据结构,就遇到过这个东西,当时下了一番功夫,可说实在的,还是没弄太明白,最多是可以分析明白,但如果是自己写,根本就写不出来,而且什么时候用递归,更是不得而知,所以,根本就不算明白,下面是一个递归过程,用来向一个树型控件内填入磁盘的文件夹和文件(象windows资源管理器的左边视图),下面这个函数是填入子目录的(非盘符),今天终于又遇到了递归,可还是不明白为什么这样写,分析了半天,总算知道这样写可以达到目的,但这不够啊,我想知道什么时候用递归,而且递归语句应用在程序的什么位置(哪一行?)。下面是代码:
void CTreeViewDlg::GetDriveDir(HTREEITEM hParent)
{
//以下是向一个目录内深入游历的语句。
HTREEITEM hChild = m_tree.GetChildItem(hParent);
while(hChild)
{
CString strText = m_tree.GetItemText(hChild);
if(strText.Right(1) != "\\")
strText += _T("\\");
strText += "*.*";
CFileFind file;
BOOL bContinue = file.FindFile(strText);
while(bContinue)
{
bContinue = file.FindNextFile();
if(file.IsDirectory() && !file.IsDots())
m_tree.InsertItem(file.GetFileName(),hChild);
}
GetDriveDir(hChild);//为什么要把递归语句放在这一行?
//下面是目录之间的转换,即一个目录游历完
//毕,就进行下一个目录的游历。
hChild = m_tree.GetNextItem(hChild,TVGN_NEXT);
}
}
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
会思考的草 2003-10-20
  • 打赏
  • 举报
回复
要使用递归,必须有两个特点:
第一,操作是类似的,只是问题的规模不同。举个例子,用递归进行10个数排序,可以这样考虑,因为2个数是非常简单的,所以我们把10个数分成两个集合,一个只有1个数,另一个集合有9个数,只要后面九个数是有序的,那么不就排好序了吗?再分割9个数成为1+8个数……直到问题分解为两个数排序,然后回溯,这样10个数就排好序了。
第二,递归必须要有出口,比如上面例子中,当分解为两个数的时候,就不必再分解了,尔后转入回溯过程。
递归是一种分治法(Divide and conquer)的思想,理解了思想就能熟练使用递归。
sdcer 2003-10-20
  • 打赏
  • 举报
回复
没人愿意帮我
阿甘 2003-10-20
  • 打赏
  • 举报
回复
to flagfly(我也不知道要去哪里):

我觉得不能改位置,因为内嵌的while,是用来插入当前子目录项下面的所有子项(文件、目录)的,如果把GetDriveDir(hChild);放到这个while之前的话,将不能遍历到所有的目录、文件,因为它的遍历的路径是根据tree的text来实现的
certbuggy 2003-10-20
  • 打赏
  • 举报
回复
到MSDN上找CFileFind类,有个递归的例子,可以看看,很清楚
sdcer 2003-10-20
  • 打赏
  • 举报
回复
请各位帮忙解答
阿甘 2003-10-20
  • 打赏
  • 举报
回复
ft~

我虽然是回答他,但是我想也说了部分想法了吧

这个递归函数比较另类一点,你找一个正统些的来看比较清楚
sdcer 2003-10-16
  • 打赏
  • 举报
回复
flagfly兄,请赐教,你是怎么看出来的?关键在哪里?
flagfly 2003-10-16
  • 打赏
  • 举报
回复
其实在你的例子中,该语句放在外while语句刚进来和最后一句之间的任一位置都可以。
即在hChild的值改变之前都可以调用该句。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧