java递归习题。完全没头绪,求帮忙。

考虑一组list(仅包含非负数),从list的第一个元素开始,目标是到达最后一个元素(最后一个元素永远为0),你可以向走或向右,你走几步取决于你的元素是几。你不能超出这个表格,也就是说你的初始位置在最左端,而且第一步只能向右。只能用递归的方法,这是开头public boolean isSolvable(int index, List<Integer> t),index指的是list中你所在的地方!
不能用sublist。。。。2.不能修改原List,但可以创造一个copy,然后对其修改。

这个是JUnit的测试CODE。
@Test
public void testIsSolvable() {
Integer[] s = {2, 3, 4, 4, 5, 4, 1, 6, 9, 0};
List<Integer> t = new ArrayList<Integer>(Arrays.asList(s));
boolean isSolvable = Lab7.isSolvable(0, t);
assertTrue("board " + t + " is solvable", isSolvable);
assertEquals("board has been modified", Arrays.asList(s), t);

Integer[] u = {1, 3, 9, 8, 3, 0};
t = new ArrayList<Integer>(Arrays.asList(u));
isSolvable = Lab7.isSolvable(0, t);
assertFalse("board " + t + " is not solvable", isSolvable);
assertEquals("board has been modified", Arrays.asList(u), t);
}
分不多,帮我写出代码的在加30分,谢谢!
junit的报错,wjm0506

public boolean isSolvable(int index, List<Integer> t){
boolean flag = false;

int i = t.get(index);

if(i == 0)
return true;
//向左走
if(index > i ){
index = index - i;
flag = this.isSolvable(index, t);


if(!flag){ //向左没通
//向右走
if((index + i) < t.size()){
index = index + i;
flag = this.isSolvable(index, t);
}
}


return flag;
}
已经测试了,要打出路径在找我,目前是能通就返回true

 

反着就是一种可以通的路径。我写的只是让他找一条可行的就OK没有找出所有!

追问

为什么第11行和第18行的this都报错了。。。大神在解决一下,,,

追答

你不会是静态方法吧,贴下图我看看什么错,我这没问题的!贴qq我加你也行

追问

对,是静态的,对不起我给错题了,老师给我们的提示少加了个static,他给我code从public static boolean isSolvable(int index, List t)开始的,那请问这要这么做呢?能不能帮我写完整啦...

追答

this去掉。。。

追问

eclipse可以了,课JUnit通不过。。。

追答

没用JUnit测试我直接跑的数据,报什么错误

有点问题等会!!

{1, 3, 9, 8, 3, 0}这组数据2个3会死循环

追问

那要怎么修改呢?要添加什么code

追答

这方法定死了就传两个参数不好搞,我看看能不能有方法!能加参数么
可不可以在方法外加变量,有没有要求?

追问

发现了一个提示。前面英语超出字数范围+ this means that it will be very useful if you find a way to keep track of all of the visited elements thus far

如果移动到你曾经到达过的地方,那说明没有一个方法能成功。也就是说这对你很有用如果你找到一个方式去记录所有你曾到达的地方

追答static List<Integer> t2 = new ArrayList<Integer>();
public static boolean isSolvable(int index, List<Integer> t){
boolean flag = false;

int i = t.get(index);

if(i == 0)
return true;
//向左走
if(index > i && !t2.contains(index)){
index = index - i;
t2.add(index);
flag = isSolvable(index, t);


if(!flag){ //向左没通
//向右走
if((index + i) < t.size() && !t2.contains(index)){
index = index + i;
t2.add(index);
flag = isSolvable(index, t);
}
}


return flag;
}

追问

还是报错,不管怎样,谢谢你了,你能在看看是什么原因吗?实在做不出来就算了,分还是给你,谢谢!

追答

static List<Integer> t2 = new ArrayList<Integer>();加上了么我试了啊可以的

不行你把两个static 先去掉试下

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-21
boolean flag = true;
int size = t.size()/2;
if (index < size) {
index = t.get(index) + index;
if (index >= t.size()) flag = false;

} else {
index = index - t.get(index);
if (index < 0) flag = false;
}
if (index == (t.size() - 1)) return true;
if (flag) isSolvable(index,t);
return flag;

写了下,没验证,死循环的情况未考虑如何处理。
第2个回答  2014-03-21
看看 怎么说的追问

大神,求解答,还可以在加分啊。。。今晚能做出来么。。。

java递归函数返回值求助
是的,这段代码中的递归调用只会返回第一次的返回值。如果你想得到800*的结果,可以修改代码,使得第二次递归调用的结果被正确地返回。具体地,你可以在第二次递归调用结束之后,将结果返回到上一层递归调用,并在第一次递归调用结束之后将结果返回。修改后的代码如下:String deal(String s1, String ...

java递归,问题。请问这2个方法什么意思,我怎么就不明白递归的原理,求...
递归调用就是依次改变参数值,重复调用自身,当满足某个条件的时候开始逐层返回,直到最后返回结果。递归调用在解决很多项的 有规律的数值的加减乘除法是很好的一种方法,因为它的代码量很小,然后能实现比较复杂的计算,被很多人所喜欢。你的程序里面的:public static int getSum(int n){ if(n==1)...

JAVA程序经常用到“递归”,“递归”的基本思想是
递归的核心思想是分解。把一个很复杂的问题使用同一个策略将其分解为较简单的问题,如果这个的问题仍然不能解决则再次分解,直到问题能被直接处理为止。比如求 1+1\/2+1\/3+...+1\/n的和,如果按照我们正常的思维,就会使用一个循环,把所有的表示式的值加起来,这是最直接的办法。如果使用递归的思...

Java用递归实现3.根据规律写出计算算法:1、7、8、15、23、38、61...
} else { \/\/ 递归调用 return getNumber(n - 1) + getNumber(n - 2);} } }

java递归:1,递归是什么?不求定义,求个简单的实际例子;2,以下代码为什么...
递归就是在某种情况下,方法调用自己 你那个代码是:1*2*3*4*5 算出来就是120了

java递归求数字10的阶乘。
我理解中的递归,就是在没完成当前运算的情况下,先完成当前运算的上一级,如上一级仍未完成则继续推向上一级,知道完成某一级运算后,在逐条往回返,最终的运算结果就是最终的值。i 为 10时,add(10) = 10*(add(9)),此时10为整数,而我们需要计算出add(9)为多少;i 为 9 时,add(9) ...

java中的递归到底是什么来的啊 本人初学的 要多的简单的例子啊 没有...
1.先想参数 2.递归的条件 3.递归的边界 以后遇到递归题,就从这三个方面思考..容易些。顺便 给你一道杨辉三角形的题。。\/ 利用递归输出杨辉三角 \/ public class YangHui { public static void main(String args[]){ int hang=0;\/\/行数 int dangQian = 0;\/\/每行的当前数 for(;hang<=9;...

谁能说说JAVA的递归是什么意思?
【5】在做递归算法的时候,一定把握出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口就是一个条件,当满足了这个条件的时候我们就不再递归了。三、示例程序:使用Java代码求5的阶乘。(5的阶乘=5*4*3*2*1)[java] view plain copy package org.wxp....

java中递归的作用是什么?为什么要用到递归?
你的两个问题其实是一个问题,对吧。递归的作用:递归算法可以解决一些通过递归定义的题目。首先需要明白什么是递归定义的题目,通俗一点来说就是一个大问题中蕴含着小问题,而小问题同时又与大问题的结构相同,只是规模更小。比如n阶乘的定义可以理解为:n!= n*(n-1)!从上面不难看出 (n-1)!

java编程求1+2+3…+100的和(用递归法)
核心代码如下:int sum=0;for(int i=1;i<=100;i++){ sum+=i;} System.out.print(sum);} } 当然你可以将核心代码直接放在main()函数中,也可以放在某个函数中(如sum()),根据你自己的需要进行选择,如果放置在sum()函数中,可以让函数有返回值int,函数体中加return 语句,直接将变量sum...

相似回答