数据结构学习笔记——递归 实例

问题简述

Part类用Map存有孩子的类和信息(数量),用String存有自己的名字name,如下:

public class Part {
	//存有孩子Part和其数据,自己名字为name
	private Map<Part, Integer> subparts;
	private String name;
	...
}

问题:通过成员函数count_howmany(Part p)计算类对象拥有目标目标结点的数量
例如,
howmany couch floor
howmany couch hospital
howmany couch couch
howmany small_rubber_washer floor
输出:
2
20
1
336
数据结构学习笔记——递归 实例_第1张图片

代码实现

第一次尝试

int amount = 1;//将初始值设为1
int amount_temp;
Part pt = new Part();
if(this.name.equals(p.name)) {return 1;}
Iterator<Part> it = subparts.keySet().iterator();
while(it.hasNext()) {
	pt = it.next();
	amount_temp = amount;//如果到分支重点还没找到,则赋值amount重新查找下一条分支。
	amount = amount * pt.count_howmany(p) * subparts.get(pt);//原先的计算方法
}
return amount;

思路分析

在树结构中查找想要的结点,首先想到的就是利用递归。设想把amount初始值设1,在递归时,把当前的value与下一层递,amount递归相乘得到最终结果。但是经过debug发现,amount * pt.count_howmany(p)* subparts.get(pt)这个算法,在第一个分支中没找到时,返回之前的amount值,让函数回到前面的结点继续寻找。

修改

//删除amount_temp
int amount=0;
Part pt = new Part();
if(this.name.equals(p.name)) {return 1;}
Iterator<Part> it = subparts.keySet().iterator();
while(it.hasNext()) {
	pt = it.next();
	amount = amount + pt.count_howmany(p) * subparts.get(pt);//修改成amount与后面值
}
return amount;

思路分析

通过做出以上改变,能在函数走到树叶部分还没找到匹配的结点时,返回amount=0,这样,就能使上一层函数中pt.count_howmany§为零,amount值不变继续在另一个分支中查找。

一点点感想。。。

对于敲代码依旧很菜的我而言,开始对最最最简单的递归(比如斐波那契数列)都想了很久。不过最近在敲代码时一步步debug过程中慢慢了解了树的前,中,后序遍历的递归实现。最后自己费了很长时间也算是写出了一段像样点的递归代码展示在大家面前。我还在漫长的编程路上学习,如有任何缺陷,敬请大佬们指正呀!

你可能感兴趣的:(程序设计,递归,树,数据结构,树的查找,Java)