我想到了几种在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)或者留下您认为有趣的解决方案(非迭代)。
感谢。
答案 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);
}