从递归函数返回多个值

时间:2012-10-25 19:04:30

标签: java recursion binary linked-list return

我遇到这个问题,我必须将十进制数转换为二进制数,然后将这些位存储在一个链表中,其中头节点是最高位,最后一个节点是最低有效位。解决问题本身实际上很简单,因为你只需要递归取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?
}

问题是我无法弄清楚如何返回2个值。拥有返回值意味着我不能单独调用encodeBin()。

此外,我应该在哪里创建列表?如果我在函数的最开头加上List<Integer> = new LinkedList<Integer>()之类的东西,那么每次函数调用自身时,它会创建一个新的列表,并在新的列表中添加不是原始权利的位?(列表从何时创建)该函数第一次调用)

有人知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

您无法单独返回两个值。但是,您可以返回一个包含第一位的数组,最后一位创建您自己的类来保存此数据,并返回该类的实例。


关于清单,我看到两个选项:

  1. 将其设为static类变量
  2. 将它作为函数的参数(虽然我看到你说你不能这样做)。
  3. 第一种方法如下:

    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代表1和{ {1}}代表false

答案 1 :(得分:0)

您无法返回2个值。您将不得不返回包含2个值的对象。根据您的家庭作业要求以及将使用此功能的位置,数组或新对象。

对于链表创建,您需要的是递归辅助方法。您的公共方法将用于初始化对象,开始递归并返回结果。这允许您的实际递归函数具有多个参数。

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);
  }

}

答案 2 :(得分:0)

我建议宣布两种方法:

(1)public static int [] encodeBin(int n) 和 (2)private static void encodeBin(LinkedList,int n)

public方法只创建一个空列表,然后调用私有版本传递空列表和orignal输入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
}