递归函数的写法笔记

Posted 霍莉雪特

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归函数的写法笔记相关的知识,希望对你有一定的参考价值。

脑袋总是记不住,做个笔记记下方便用时查询。

 

情景一:Java电商项目中的商品品类管理。品类呈树形结构,现要求找到某一节点下的所有子节点。

// 递归算法,找到子节点
private Set<Category> findChildCategory(Set<Category> categorySet, Integer categoryId){
    // Mybatis的数据库查询方法
    Category category = categoryMapper.selectByPrimaryKey(categoryId);
    if (category != null){
        categorySet.add(category);
    }

    // 查找子节点,如果子节点为空就退出递归。递归算法一定要有一个退出的条件
    List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId);
    for (Category categoryItem : categoryList){
        findChildCategory(categorySet, categoryItem.getId());
    }

    return categorySet;
}

这里为了防止品类重复使用了Set集合。使用该集合要求实体类Category重写equals()和hashCode()方法。

 

情景二:WPF中UI呈树形结构,想要查找指定控件下的所有子控件。

public static List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
{
    DependencyObject child = null;
    List<T> childList = new List<T>();

    for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
    {
        child = VisualTreeHelper.GetChild(obj, i);

        if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
        {
            childList.Add((T)child);
        }

        childList.AddRange(GetChildObjects<T>(child, ""));
    }

    return childList;
}

 

观察函数的规律:

  • 返回值和传参是相同的集合列表。
  • 传参一个变量用来筛选符合条件的子节点。

以上是关于递归函数的写法笔记的主要内容,如果未能解决你的问题,请参考以下文章

ZROI2017 做题笔记

算法笔记4.3 递归

JavaScript 递归的几种写法

C++面试笔记--树

python递归函数

C语言笔记初级篇第三章:函数与递归