我想写一个遵循这种逻辑的递归方法:
如果数组为[3,3,3,3],则它将返回值30,因为Trail [i]的连续数彼此相等。所以这里发生的是3 +(3 * 2)+(3 * 3)+(3 * 4)= 30
另一个例子是[2,4,3],它将返回值9
我希望这是有道理的
有人可以帮忙吗?
答案 0 :(得分:1)
您可以尝试这种方式
int sum(int pos, int[] trail, int cnt) {
if (pos >= trail.length) { // when full array traversed
return 0;
}
if (pos != 0 && trail[pos - 1] == trail[pos]) { // if previous element is same
return (cnt + 1) * trail[pos] + sum(pos + 1, trail, cnt + 1);
} else { // first element or prev not same
return trail[pos] + sum(pos + 1, trail, 1);
}
}
以这种方式调用sum(0, trail, 0)
答案 1 :(得分:1)
您为什么需要递归?
简单的循环就可以完成工作:
public int sum(int[] arr) {
int sum = 0;
for (int i = 0, p = 0; i < arr.length; i++) {
if (i == 0 || arr[i] == arr[i - 1]) {
p++;
} else {
p = 1;
}
sum += arr[i] * p;
}
return sum;
}
更新
Java 8 Stream API可用于产生相同的结果:
public int sumStream(int[] arr) {
int[] pp = {0};
return IntStream.range(0, arr.length)
// update the quotient for the i-th element
.peek(i -> {
pp[0] = i == 0 || arr[i] == arr[i - 1] ? pp[0] + 1 : 1;
})
.map(i -> pp[0] * arr[i])
.sum();
}
答案 2 :(得分:1)
正如其他人已经提到的那样,无需使用递归就可以很容易地将其编写为交互函数,但是如果由于某些原因您仍然想要递归函数,则将如下所示:
int recursiveHelper(int[] nums, int index, int pow){
if(index >= nums.length) return 0;
if(index == 0)
return nums[0] + recursiveHelper(nums, index+1,0);
else{
if(nums[index] == nums[index-1])
return nums[index] * pow + recursiveHelper(nums, index, pow+1);
else
return nums[index] + recursiveHelper(nums, index+1,0);
}
}
请注意我们如何传递 pow 变量来跟踪整数的重复。如果一个数字不等于其前一个数字,则忽略pow并将其设置为0。如果一个数字不等于其前一个数字,我们将pow递增并调用递归函数。
注意::我没有执行此操作,这里可能会有一些错别字和错误,但这应该可以让您了解如何开始。
答案 3 :(得分:0)
int[] values = new int[]{3,3,3,3};
int currentNumber=0,previousNumber=-1,count=1,sum=0;
for(int i = 0; i<values.length;i++,previousNumber = currentNumber){
currentNumber = values[i];
if(currentNumber == previousNumber){
count++;
}else{
count=1;
}
sum += currentNumber*count;
}
System.out.println("Sum : " + sum);