java - 递归问题

标签 java list recursion

我正在尝试用 Java 做一个问题,其中涉及获取一个 Lisp 列表和一个整数,并将列表中的所有项目乘以该整数,但它必须使用递归。这是我的代码:

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() 方法。

关于java - 递归问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47000990/

相关文章:

java - Scanner.next() 不阻塞

java - Android 2.1 的 Android Base64 解码

c# - StringArrays As A List<> Items -> 如何通过更改一个项目(预定义字符串数组)来防止更改所有项目

python - 对于第三个列表中给定数量的元素,返回两个列表之间的字符串匹配

c# - 递归。并非所有代码路径都返回一个值

java - ant 构建的应用程序版本无法找到依赖的 jar

java - 使用 Robolectrics 和 Mockito 来模拟/ stub 函数调用发出 http 请求,但它不起作用

c# - 在列表中查找具有最低属性值的项目

c++ - 尝试在 C++ 中使用递归确定字符串的长度

javascript - javascript 中递归的转换