我试图在Java中做一个问题,其中涉及一个Lisp List和一个整数,并将列表中的所有项目乘以该整数,但是它必须使用递归。这是我的代码:
public static LispList<Integer> multipy(LispList<Integer> ls, int m){
LispList<Integer> ls1 = LispList.empty();
if(ls.isEmpty()){
return ls1;
}else{
ls1.cons(ls.head() * b);
}
return multipy(ls1, m)
}
我的想法是首先创建一个空列表ls1。然后,我使用一个基本案例检查原始列表ls是否为空,如果是,则返回新列表ls1。如果不为空,则将所有项目乘以该整数并将其传递给ls1。然后,我最后再次调用该方法。
但是我的问题是这将无法正常工作,因为它将每次创建一个新的列表ls1,从而破坏已经创建的列表。我曾考虑过将ls1传递到递归调用中,但是这很重要,因为它在ls1上运行,而不是按要求运行ls。有没有解决的办法,或者我必须使用迭代方法来做到这一点?
最佳答案
multiply(ls.tail(),m)
为您提供一个列表,其中包含ls
尾部所有值相乘的所有值。在该列表中,您只需要将乘以ls
的头相乘即可,这似乎与cons()
方法有关。因此,它将类似于:
public static LispList<Integer> multipy(LispList<Integer> ls, int m){
// No point making the else case if your
// last statement of the block is a return
if(ls.isEmpty()) return LispList.empty();
return multiply(ls.tail(),m).cons(ls.head()*m);
}
我假设您的
LispList
具有tail()
方法。