黑马程序员技术交流社区
标题:
递归,又晕了
[打印本页]
作者:
张小锋
时间:
2012-5-9 00:12
标题:
递归,又晕了
本帖最后由 张小锋 于 2012-5-9 00:15 编辑
public class 得到相同子字符串{
public static void main(String args[]){
System.out.println(getSameStr("xiaofeng", "suibianxiaoasdasdxiaofengxiaofeng"));
}
public static String getSameStr(String str1,String str2){
String shortStr=str1.length()>str2.length()?str2:str1;//获取较短的那个字符串
String longerStr=str1.length()>str2.length()?str1:str2;
String sign=null;
ArrayList vect=new ArrayList(){//从写了Add方法,目的是不向集合中添加重复元素。
@Override
public boolean add(Object e) {
if(this.contains(e)){
return false;
}
else{
super.add(e);
return true ;
}
}
};
addSplitStr(shortStr,0,shortStr.length(),vect);
Collections.sort(vect,new Comparator(){
@Override
public int compare(Object o1, Object o2) {
return o2.toString().length()-o1.toString().length();//按字符串长度倒叙排序
}
});
for (Object object : vect) {
if(longerStr.contains(object.toString())){//比较元素是否包含在长的那个字符串之中
sign=object.toString();
break;
}
}
return sign;
}
//----------------------------------------------------------下面的递归,两次调用了方法体--------------------------------//
public static void addSplitStr(String str,int startIndex,int endIndex,ArrayList vect){ 标记:A
if(startIndex!=endIndex){
vect.add(str.substring(startIndex,endIndex));
addSplitStr( str, startIndex+1, endIndex, vect); 标记:B
addSplitStr( str, startIndex, endIndex-1, vect); 标记:C
}
}
}
每次用到类似这种递归法时,尤其在二叉树遍历集合元素,虽然能达到想要的目的,但对这中递归法一直不得其解,一般递归法是在方法体中通过调用方法本身来实现循环,但遇到上面这种情况是两次调用了方法体,我总觉得程序执行到B那个地方时会回到A那个地方,C那块应该永远没有执行的机会,但事实并不如此,C那块也能执行,请能帮我解释一下这是为什么呢?
作者:
黑马-王建雨
时间:
2012-5-9 00:19
等高手来解答
作者:
邱俊杰
时间:
2012-5-9 01:04
我i觉得看你的代码很辛苦诶,
作者:
黄秋
时间:
2012-5-9 03:07
LZ的代码,让我想起另一递归程序,那个不只“两次调用了方法体”,它是由一for 循环,调用递归的方法体,下面给出链接:
http://bbs.itheima.com/thread-8408-1-1.html
可以说,那个程序比你的还复杂,但其代码简洁,很有意思。你如果只是想弄清楚“两次调用了方法体” 的递归,就不要用这个复杂的例子,起码我就没时间去看那堆代码,黑马视频还没看完呀。
作者:
—__
时间:
2012-5-9 10:53
本帖最后由 —__ 于 2012-5-9 10:58 编辑
楼上的连接你可以看一下,我说下自己的看法,
其他我认为思路要清晰,然后就很简单了,你要了解到什么是递归,其实用for循环的方式也能达到同样的目的是不是?
其次说下递归,就像你说的递归是调用方法本身来实现循环,也就是在调用内部方法,这个循环是隐形的不可见的,他不像for 在重复循环源代码,而是在内部自己执行也就可以理解为 当代码运行到递归这一句的时候 就类似于等待机制 睡着了,然后等这段代码自己运行完了,然后等待机制就醒了 然后继续往下运行。(不知道这里你懂不懂)
简单给你上个图片
111.jpg
(34.92 KB, 下载次数: 78)
下载附件
2012-5-9 10:57 上传
作者:
—__
时间:
2012-5-9 10:55
本帖最后由 —__ 于 2012-5-9 10:59 编辑
图片没传好 怎么找不到删除功能了呢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2