c++ - 带负数的递归最小值

标签 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 输入不起作用。有什么想法吗?

最佳答案

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

#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);
  }
}

关于c++ - 带负数的递归最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43811989/

相关文章:

c++ - 更改 {} 和访问修饰符的 Clang 格式

algorithm - 理解树递归的直观方法——编写代码检查二叉树是否平衡

java - 二维阵列中所有岛之间的最大总和是多少?必须使用递归

c++ - 这种递归方法有什么问题?计算 2 个 vector 中相同索引中的匹配元素的数量

recursion - 递归结构错误生命周期(无法为函数调用中的生命周期参数推断适当的生命周期... [E0495])

algorithm - 来自算法的递归方程

c++ - 实现链表 : head insertion and destructor

c++ - 为什么这两种输入字符串的方法都有效?

c++ - C++中的UE4播放时间

c++ - 如何在 Vector 类中创建 operator=?