带负数的递归最小值

时间:2017-05-05 18:53:04

标签: c++ recursion

我必须使用递归函数按升序对数组进行排序。例如,给定输入

5 | 12 31 48 25 50

输出必须是

5 | 12 25 31 48 50

开头的数字是数组的大小。

我已经生成了这段代码(它必须使用递归函数):

#include <iostream>

using namespace std;

int minimo(int *A, int lung) {

 if (lung == 1)
  return A[0];

 int k = minimo(A+1, lung-1);
 return A[0] < k ? A[0] : k;

}

//sort function
void ordina(int *A, int lung) {

 if (lung > 0) { 

  cout << minimo(A, lung) << " ";
  ordina(A+1, lung-1);

 } 

}


int main() {

    int lung;
    int A[100];
    cin >> lung;

    for(int i = 0; i < lung; i++) { 
        cin >> A[i];
    }

    //print array
    ordina(A, lung);

  return 0;
}

上面的输入代码效果非常好,但是当我尝试使用负输入格式时,例如:

7 | 73 49 12 37 23 -14 -14

输出结果为:

7 | -14 -14 -14 -14 -14 -14 -14

你能解释一下为什么吗?

ordina函数调用自身;我减少了长度,然后增加A+1,这样min就不会在同一个数组上计算多次。还

return A[0] < k ? A[0] : k;

这里我检查A [0]中的项是否低于k但每次k都改变,因为递归函数在堆栈上每个“循环”都有不同的变量。我真的不明白为什么-14输入不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

返回位置(返回前递增),必要时进行交换。

#include <iostream>

using namespace std;

int minimo(int* A, int length) {
  if (length ==1) {
    return 0;
  } else {
    int position = minimo(A+1,length-1)+1;
    if (A[0]<A[position]) {
      return 0;
    } else {
      std::swap(A[0],A[position]);
      return 0;
    }
  }
}


void ordina(int* A,int length) {
  if (length>0) {
    cout<< A[minimo(A,length)]<< " ";

    ordina(A+1,length-1);
  }
}


int main() {

    int lung;
    int A[100];
    cin >> lung;

    for(int i = 0; i < lung; i++) {
        cin >> A[i];
    }

    //print array
    ordina(A, lung);

  return 0;
}

但是,它总是返回位置0,所以这不是代码的最终形式。演变代码不返回任何内容:

void minimo(int* A, int length) {
  if (length > 1) {
    minimo(A+1,length-1);
    if (A[0]>A[1]) {
      std::swap(A[0],A[1]);
    }
  }
}


void ordina(int* A,int length) {
  if (length>0) {
    minimo(A,length);
    cout<< A[0]<< " ";

    ordina(A+1,length-1);
  }
}

答案 1 :(得分:1)

问题是你删除了数组的第一个元素,而不是迭代后的最小元素:

ordina(A+1, lung-1);

如果正确的元素更大,你可以做的就是交换元素。 min元素最终到达数组A [0]

的开头

就像BubbleSort一样简单:

int minimo(int *A, int lung) {

if (lung == 1)
    return A[0];

minimo(A+1, lung-1);   //YOU DON'T NEED THE RESULT
if (A[0] > A[1])
    std::swap(A[0], A[1])
return A[0];

}