輸入字串 => 1, 3 , (2,4,6), 5, 7
輸出以下
1+3
1+ ( (2+4)+(2+6)+(4+6))
1+5
1+7
3+ ( (2+4)+(2+6)+(4+6))
3+5
3+7
( (2+4)+(2+6)+(4+6)) +5
( (2+4)+(2+6)+(4+6))+7
5+7
我在練習遞迴,所以我寫了一個會先計算 題目中(2,4,6)的總和的程式,
但出來總和一直是錯誤的
以下是我的程式片段
#include<stdio.h>
int recursion(int* array,int i,int j,int size){
int sum = 0;
if(i < size-1){
if(j < size ){
printf("%d\n",array[i]+array[j]);
sum = sum+array[i]+array[j];
j++;
recursion(array,i,j,size);
}
else{
printf("\n");
i++;
j=i+1;
recursion(array,i,j,size);
}
}
return sum;
}
int main(){
int i=0,j=i+1,sum=0;
int a[3]={2,4,6};
int c =recursion(a,i,j,3);
printf("\n\n%d",c);
return 0;
}
程式print的地方都是正確的都有印出來,但是sum 一直只有算到 6 (應該是2+4算出的)
所以好像只有抓到第一次進入遞迴function的樣子!
請問錯誤在哪裡呢??
#include<stdio.h>
int recursion(int* array,int i,int j,int size){
int sum = 0;
if(i < size-1){
if(j < size ){
printf("+(%d+%d)",array[i], array[j]);
sum = sum+array[i]+array[j];
j++;
sum = sum + recursion(array,i,j,size);
}
else{
i++;
j=i+1;
sum = sum + recursion(array,i,j,size);
}
}
return sum;
}
int main(){
int i=0,j=i+1,sum=0;
int a[3]={2,4,6};
int c =recursion(a,i,j,3);
printf("=%d",c);
return 0;
}
我寫一個Javascript的例子,你再用C實作看看:
function compose2(arr) {
if(arr.length < 2) return [];
if(arr.length > 2) {
var ret = [];
for(let i=1; i<arr.length; i++) {
ret.push([arr[0], arr[i]]);
//用陣列第一個元素跟其他元素組合
}
return ret.concat(compose2(arr.slice(1)));
//拿掉陣列第一個元素再遞迴下去
} else {
return [arr];
//如果傳入陣列只有兩個元素,直接返回
}
}
//var a = [1,2,5,3,8,15,24];
var a = [2, 4, 6];
console.log(compose2(a, 2));
//印出 [ [ 2, 4 ], [ 2, 6 ], [ 4, 6 ] ]
console.log(compose2(a, 2).reduce(function(p, c) {return p + c[0] + c[1]}, 0));
//印出 24
我的作法是先找出所有組合,再把這些組合算出來。