停止递归算法

stopping a recursive algorithm

本文关键字:递归算法      更新时间:2023-10-16

有10个数字必须满足以下等式:

(a[0]+a[1]+a[3]+a[4]) =S

([9] + [0] + [7] + [8]) = S

([2] + [1] + [9] + [8]) = S

(a[2]+a[3]+a[5]+a[6]) =S

([8] + [7] + [5] + [4]) = S

我有一个数组中的10个数字,通过使用递归排列算法,我试图找到所有可能的排列来检查这些数字是否满足上述方程。一旦找到正确的排列,我希望程序返回true并停止生成其他排列。下面是代码,但它总是返回false。例如,对于数字1、2、3、4、5、6、8、9、10、12和S=24,我们有一个答案:1、8、2、12、3、6、4、10、5、9但算法返回false无论如何!!

bool permute(int *array,int i,int length, int S) { 

  if (length == i){
    if( check( array, S) )
            return true;
        else
        return false;   
  }
  int j = i;
  for (j = i; j < length; j++) { 
     swap(array+i,array+j);
     if( check( array, S) )
            return true;
     permute(array,i+1,length, S);

     swap(array+i,array+j);
     if( check( array, S) )
            return true;
  }
  return false;
}
bool check( int* a, int S){
    if((a[0]+a[1]+a[3]+a[4]) ==S && (a[9]+a[0]+a[7]+a[8]) ==S && (a[2]+a[1]+a[9]+a[8]) ==S && (a[2]+a[3]+a[5]+a[6]) ==S && (a[8]+a[7]+a[5]+a[4]) ==S)
            return true;
    return false;
}

您必须处理返回状态。permute(array,i+1,length, S);返回一个状态-检查它是否为真,在这种情况下返回:if(permute(array,i+1,length, S)) return true; .