我试图在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()方法。

07-24 09:32