当前位置: 首页 > 知识库问答 >
问题:

空洞法递归误差

谭宜
2023-03-14
static int x,y,fx,fy;
static char g[][]={ //your maze array , # represents wall and . represents path};
static Stack<Integer>stackx=new Stack<Integer>();
static Stack<Integer>stacky=new Stack<Integer>();
// both of the stacks are used for reverting changes int he maze to original
public static void main(String args[])
{
    x=y=0;
		for(int i=0;i<g.length;i++)
		{
			for(int j=0;j<g[i].length;j++)
			{
				if(g[i][j]=='S')
				{
					x=j;
					y=i;
				}
				else if(g[i][j]=='G')
				{
					fx=j;
					fy=i;
				}
			}
		}
    rec(x,y);
    System.out.println("HEllooooooo");
}
public static void rec(int x,int y)
{
   try
   {
       System.out.println(x+" "+y+" "+check);
       if(x==fx && y==fy)
       {
           System.out.println("YES");
           check=true;
           x=y=0;
           return;
       }
       System.out.println(x+" "+y+" "+check);
       if(check==false)
       {
                         revert();// reverts maze back to original
		 change(); // slides walls in the maze
	
		for(int i=0;i<g.length;i++)
		{
			for(int j=0;j<g[0].length;j++)
			{
				System.out.print(g[i][j]);
			}
			System.out.println("");
		}
		if(!valid(x,y+1))
		{
			if(!((y+1)>(g.length-1)))
			{
				g[y+1][x]='#';
			}
		}
		else
		{
			rec(x,y+1);
		}
		if(!valid(x+1,y))
		{
			if(!((x+1)>(g[0].length-1)))
			{
				g[y][x+1]='#';
			}
		}
		else
		{
			rec(x+1,y);
		}
		if(!valid(x-1,y))
		{
			if(!((x-1)>=0))
			{
				g[y][x-1]='#';
			}
		}
		else
		{
			rec(x-1,y);
		}
		if(!valid(x,y-1))
		{
			if(!((y-1)>=0))
			{
				g[y-1][x]='#';
			}
		}
		else
		{
			rec(x,y-1);
		}
       }
    }catch(ArrayIndexOutOfBoundsException e)
     {
        System.out.println("NO");
        return;
     }
}

输出如下

4 1 false
YES      // output is correct and should end but it continues//
2 1 true //x and y values change from 4,1 to 2,1 even with no code to manipulate them
2 1 true
3 0 true
3 0 true
4 0 true
4 0 true
NO
1 1 true
1 1 true
0 1 true
0 1 true
NO
HEllooooooo

共有1个答案

令狐跃
2023-03-14

如果击中fx,fy是最终目标,那么:

boolean rec( int x, int y )

在打印“是”之后:

return true;

所有递归调用rec(...,...)都应该替换为

if( rec( ..., ... ) ) return true;
return false;
 类似资料:
  • 主要内容:递归的底层实现机制编程语言中,我们习惯将函数(方法)调用自身的过程称为 递归,调用自身的函数称为 递归函数,用递归方式解决问题的算法称为 递归算法。 函数(方法)调用自身的实现方式有 2 种,分别是: 1) 直接调用自身,例如: 2) 间接调用自身,例如: 程序中,function1() 函数内部调用了 function2() 函数,而 function2() 函数内部又调用了 function1() 函数。也就是

  • 我有两个非递归方法,其中一个读取字符串中的总“e”字符,另一个检查 ArrayList 是否按字母顺序排列。 递归方法的定义是方法调用自身。我相信我理解这个概念,但要实现它或将其转换为递归方法确实很困难。我怎样才能将这些方法转化为递归方法,同时我应该如何思考?此外,这是我的另一种方法,它只打印出指定数字大小的数字。 条件方法检查数字的第一个数字(从右起)是否大于第二个数字,并再次检查第二个是否大于

  • 我不明白为什么我会得到这个最大深度错误。iam试图使用bst递归方法在数组中查找数字索引,下面是我的代码 任何人都可以告诉我代码块中发生了什么 错误块: PS C:\Users\admin\Desktop\DSA

  • 程序调用自身的编程技巧称为递归(recursion),它做为一种算法在程序设计语言中广泛应用。 Java 支持递归,在 Java 编程中,递归是允许方法调用自身调用的属性。调用自身的方法称为是递归的。 递归的典型例子是数字的阶乘。数字 N 的阶乘是 1 到 N 之间所有整数的乘积。例如 3 的阶乘就是 1×2×3。下面的程序使用递归来计算数字的阶乘。 该程序产生的输出如下所示: 3的阶乘是 6 4

  • 我正在处理我当前的任务,即创建一个LinkedList数据结构,我已经创建了它以及其他方法,它工作得非常好。我正在处理我的最后一个问题,即制作一个toString方法。它应该: toString方法返回列表的字符串表示形式。用逗号分隔每个项目,并用大括号括住这些项目,例如{1,4,7,5}。公共toString方法必须调用私有递归方法来生成以逗号分隔的项目列表。(但您可以在公共方法中添加大括号。)

  • 我试图用递归的方法解决硬币兑换问题。问题是这样的: 你会得到不同面额的硬币和总金额。编写一个函数来计算组成该数量的组合数。 您将获得一个数量和一组硬币。 这是我到目前为止所拥有的: 当我这样做的时候,我没有得到任何接近正确的组合。我认为问题是回报,但我不明白为什么。在这里,我把硬币从数量中减去,每次都加在一起。当它得到0时,它返回1。