在Java中使用递归的不同方法

时间:2014-06-10 10:32:37

标签: java recursion

我想到了几种在Java中编写简单的类似Lisp的递归函数的优雅方法,它可以说是一个简单的求和。

在Common Lisp中,它会是这样的:

(defun summation(l)
    (if l
        (+ (car l) (summation (cdr l)))
        0))

(summation '(1 2 3 4 5)) ==> 15

在Java中,许多可能的解决方案之一是:

public int summation(int[] array, int n) {
    return (n == 0)
            ? array[0]
            : array[n] + summation(array, n - 1);
}
CALL: 
summation(new int[]{1,2,3,4,5}, 4); //15

1)有没有办法不使用索引n?

2)或者留下您认为有趣的解决方案(非迭代)。

感谢。

5 个答案:

答案 0 :(得分:2)

使用Java集合 - 这样的事情可以让您了解如何消除n并根据列表大小进行递归:

public int summation( List<Integer> list ) {
    return list.isEmpty()
        ? 0
        : list.get( list.size - 1 ) + summation( list.subList( 0 , list.size() - 1 )  );
}

干杯,

答案 1 :(得分:2)

通常,我使用公共API 来解决这种递归,它不需要索引参数和带有任何签名的私有API 我喜欢它。为此,我会这样分开:

public int summation(int[] numbers) {
    return summation(numbers, numbers.length - 1);
}

private int summation(int[] numbers, int till) {
    return (till < 0) ? 0 : numbers[till] + summation(numbers, till - 1);
}

请注意,您必须检查till < 0,因为它正确处理空数组。


另一种方法是不使用数组,而是任何Iterable<Integer>

public int summation(Iterable<Integer> numbers) {
    return summation(numbers.iterator());
}

private int summation(Iterator<Integer> numbers) {
    return (numbers.hasNext()) ? numbers.next() + summation(numbers) : 0;
}

提示:numbers.next() + summation(numbers)中的来电顺序非常重要,因为next()来电必须先完成。

答案 2 :(得分:1)

如果使用List.subList方法,它可以在下面执行迭代。您可以改为使用队列,以避免迭代。例如:

public int sum(Queue queue) {
  return queue.isEmpty() ? 0 : (queue.poll() + sum(queue));
}

答案 3 :(得分:0)

public class HelloWorld{


static int sum=0;
static int c;

     public static void main(String []args){

      int[] y={1,2,3,4,5};

      c=y.length;
     System.out.println( summation(y)); //15

     }

     public static int summation(int[] array) {

    c--;
    if(c<0){
        return sum;
           }
    else{
        sum+=array[c];
        return summation(array);

        }
}

}

答案 4 :(得分:0)

这里有一个简单的方法,看起来非常接近于被要求的东西。基本上,我们采用递归的方法来执行求和与自下而上的蛮力相关。

public static int sumToN(int n) {
    if( n == 0 ){
        return 0;
    }
    return n + sumToN(n - 1);
}