java 从递归函数返回多个值

wko9yo5t  于 2022-11-27  发布在  Java
关注(0)|答案(3)|浏览(254)

我遇到了一个问题,我需要把十进制数转换成二进制数,然后把这些位存储在一个链表中,链表的头节点是最高有效位,最后一个节点是最低有效位。解决这个问题本身其实很容易,因为你只需要递归地取2的模,然后把结果加到链表中,直到十进制数变成0。
我遇到的问题是我必须编写函数,使其返回一对数字,(无论是数组还是列表)最高有效位和最后有效位。即:在函数中输入14将返回(1,0),因为14在二进制中是1110。
我可以轻松访问MSB和LSB(getFirst()、getLast())。
该函数只能接受一个十进制数参数。
目前我有这个当前代码:

public static void encodeBin(int n) {
    if(n == 0) return; //Base case
    else {
        if(n % 2 == 0)
            theList.addFirst(0);
        else
            theList.addFirst(1);
        encodeBin(n / 2);
    }
    // return?
}

问题是我不知道如何返回这两个值。有一个返回值意味着我不能自己调用encodeBin()。
另外,我应该在哪里创建列表呢?如果我在函数的最开始放置类似于List<Integer> = new LinkedList<Integer>()的内容,那么每次函数调用自己时,它都会创建一个新的列表,并在新列表中添加不是原来正确的位?(从第一次调用函数时创建的列表)
有人知道怎么解决这个问题吗?

wnavrhmk

wnavrhmk1#

您不能返回2个值。您必须返回包含这2个值的某个对象。可以是数组,也可以是某个新对象,这取决于您的家庭作业要求以及此函数的使用位置。
对于链表的创建,你需要一个递归的helper方法。你的public方法将被用来初始化你的对象,开始递归,并返回你的结果。这允许你的递归函数有一个以上的参数。

public static SOME_TYPE encodeBin(int n) {
  LinkedList result = new LinkedList();
  encodeBin_helper(result,n);
  // return the MSB and LSB
}

public static void encodeBin_helper(LinkedList theList, int n) {
  if(n == 0) return; //Base case
  else {
    if(n % 2 == 0)
        theList.addFirst(0);
    else
        theList.addFirst(1);
    encodeBin_helper(theList, n/2);
  }

}
nnvyjq4y

nnvyjq4y2#

不能分别返回两个值。但是,可以返回一个包含第一位和最后一位的数组 * 或者 * 创建自己的类来保存这些数据,并返回该类的一个示例。
而关于名单,我看到两个选项:
1.使其成为static类变量
1.使它成为函数的一个参数(尽管我看到你说你不能这样做)。
第一种方法如下所示:

public class MyClass {
    private static List<Integer> theList = new LinkedList<Integer>();

    // `encodeBin` method as you have it
}

第二种方法如下所示:

public static void encodeBin(int n, List<Integer> theList) {
    if(n == 0) return; //Base case
    else {
        if(n % 2 == 0)
            theList.addFirst(0);
        else
            theList.addFirst(1);
        encodeBin(n / 2, theList);
    }
}

然后你可以做一些事情

List<Integer> theList = new LinkedList<Integer>();
encodeBin(14, theList);

theList将根据需要保持适当的位。
需要注意的是,您可能需要考虑使用 * 布尔值 * 列表而不是 * 整数 * 列表,其中true表示1false表示0

enyaitl3

enyaitl33#

我建议声明两个方法:
(1)(2)私有静态空编码Bin(链接列表,int n)
public方法只创建一个空列表,然后调用private版本,将空列表和原始输入n作为参数传递
就像这样:

public static int[] encodeBin(int n) {
  LinkedList<Integer> aList = new LinkedList<Integer>();
  encodeBin(aList , n);
  int MSB = aList.getFirst();
  int LSB = aList.getLast();

  return new int[] {MSB, LSB};
}

private static void encodeBin(LinkedList<Integer> list, n) {
  //your recursive version here
}

相关问题