輸入字串 => 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
我的作法是先找出所有組合,再把這些組合算出來。