关于java 递归 返回值 的疑惑!!!...!!! 求高手解疑惑....

香草芭芙 2012-12-05 10:12:35
package com.test1;

public class Test3
{
public static void main(String[] args)
{
int arr[] = { 2, 5, 7, 12, 25 };
BinaryFind bf = new BinaryFind();
System.out.println("找到不明白下标:" + bf.find(0, arr.length, 25, arr));

}

}

class BinaryFind
{
public int find(int leftIndex, int rightIndex, int val, int arr[])
{
int midIndex = (rightIndex + leftIndex) / 2;
int midVal = arr[midIndex];
if (leftIndex > rightIndex)
{
return 0;
}
if (midVal > val)
{
find(leftIndex, midIndex - 1, val, arr);
}
else if (midVal < val)
{
find(midIndex + 1, rightIndex, val, arr);
}
else if (midVal == val)
{
System.out.println("找到正确下标:" + midIndex);
}
System.out.println("执行到这儿了吗?");
return midIndex;
}
}
控制台输出结果是:
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
找到正确下标:4
执行到这儿了吗?
执行到这儿了吗?
找到不明白下标:2

//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
为什么不应该是
找到正确下标:4
执行到这儿了吗?
找到不明白下标:4

为什么会输出2次"执行到这儿了吗?"
"找到不明白下标:2" 为什么是2 不是4 呢?
请高手解下疑惑... 郁闷一晚上了...!!! >. <
...全文
302 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ec_huyinghuan 2012-12-06
  • 打赏
  • 举报
回复

        1            V = L/2 
f(V,L){ f(V,L-L/4)   V>L/2 } 
        f(V,L/4)     V<L/2 
xingfuzhuzi1314 2012-12-06
  • 打赏
  • 举报
回复
呵呵。是啊。。 纠结了老半天,呵呵。。 不过LZ通过自己的努力解决了,good! 散分,呵呵!
香草芭芙 2012-12-06
  • 打赏
  • 举报
回复
非常感谢,各位的回答,帮助很大!! 单步调试了下, 发现 java虚拟机 找到 正确下标之后 第一次执行return 竟然不退出 函数,而是跑到了 find(leftIndex, midIndex - 1, val, arr); 这一行, 也不执行这个函数,而又跑到 System.out.println("执行到这儿了吗?"); return midIndex; 这儿之后 执行return 第二次 才退出函数, 囧... 不按套路出牌 -0 -...
nmyangym 2012-12-06
  • 打赏
  • 举报
回复
修改了一下,楼主参考:


public class Test3
{
	public static void main(String[] args)
	{
		int arr[] = { 2, 5, 7, 12, 25};
		BinaryFind bf = new BinaryFind();
		int result=bf.find(0, arr.length, 25, arr);
		String end=result>0 ? " 找到目标 下标是: " +result: "没有找到目标!!!"; 
		System.out.println(end);
	}
}

class BinaryFind
{
	static int result=0;//保存返回结果
	public int find(int leftIndex, int rightIndex, int val, int arr[])
	{
		int midIndex = (rightIndex + leftIndex) / 2;
		int midVal = arr[midIndex];
		if (leftIndex > rightIndex)
		{
			return 0;
		}
		if (midVal > val)
		{
			find(leftIndex, midIndex - 1, val, arr);
		}
		else if (midVal < val)
		{
			find(midIndex + 1, rightIndex, val, arr);
		}
		else if (midVal == val)
		{
			System.out.println("找到正确下标:" + midIndex);
			System.out.println("执行到这儿了吗?");		//输出放在这里就不会输出多个.(找到时输出一次,找不到一次不执行).
			result=midIndex;				//找到下标赋给result.
		}
		return result;
	}
}
xingfuzhuzi1314 2012-12-06
  • 打赏
  • 举报
回复
LZ,你这判断是否等于25,找到正确的下标,不用转这么大一圈吧!!循环遍历下数组就OK了, 不清楚LZ的初衷是为什么要写着递归!
xingfuzhuzi1314 2012-12-06
  • 打赏
  • 举报
回复
LZ,纠结了我老半天,终于给弄明白了。。 由于你下于的时候,重新调用了下自己的find,最后输出了 找到正确下标:4 执行到这儿了吗?,, 可最初的bf.find(0, arr.length, 25, arr)这个,也必须是要返回的,然后是最原始的输出。 System.out.println("执行到这儿了吗?"); 这个时候 midIndex=2.。

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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