A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张小锋 中级黑马   /  2012-5-9 00:12  /  2472 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张小锋 于 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那块也能执行,请能帮我解释一下这是为什么呢?


5 个回复

倒序浏览
等高手来解答
回复 使用道具 举报
我i觉得看你的代码很辛苦诶,
回复 使用道具 举报
LZ的代码,让我想起另一递归程序,那个不只“两次调用了方法体”,它是由一for 循环,调用递归的方法体,下面给出链接:
http://bbs.itheima.com/thread-8408-1-1.html

可以说,那个程序比你的还复杂,但其代码简洁,很有意思。你如果只是想弄清楚“两次调用了方法体” 的递归,就不要用这个复杂的例子,起码我就没时间去看那堆代码,黑马视频还没看完呀。
回复 使用道具 举报
本帖最后由 —__ 于 2012-5-9 10:58 编辑

楼上的连接你可以看一下,我说下自己的看法,
其他我认为思路要清晰,然后就很简单了,你要了解到什么是递归,其实用for循环的方式也能达到同样的目的是不是?
其次说下递归,就像你说的递归是调用方法本身来实现循环,也就是在调用内部方法,这个循环是隐形的不可见的,他不像for 在重复循环源代码,而是在内部自己执行也就可以理解为 当代码运行到递归这一句的时候 就类似于等待机制 睡着了,然后等这段代码自己运行完了,然后等待机制就醒了 然后继续往下运行。(不知道这里你懂不懂)
简单给你上个图片

111.jpg (34.92 KB, 下载次数: 49)

111.jpg
回复 使用道具 举报
本帖最后由 —__ 于 2012-5-9 10:59 编辑

图片没传好 怎么找不到删除功能了呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马