gpt4 book ai didi

检查数组的排序

转载 作者:太空狗 更新时间:2023-10-29 15:26:13 25 4
gpt4 key购买 nike

我正在尝试编写一个代码来检查动态数组是否已排序,但出现错误。代码必须是递归的。

当我输入一个未排序的数组时似乎没有问题,但是当我输入一个排序的数组时程序突然停止并显示:

Process return -1073741571

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
int ordenado(int*);

int main() {
int i = 0, res = 0;
int*arr = NULL;
arr = (int*) malloc(sizeof (int));
while (arr[i] != 0) {
i++;
arr = (int*) realloc(arr, (i + 1) * sizeof (int));
scanf("%d", &arr[i]);
}
res = ordenado(arr);
printf("\n%d ", res);
return 0;
}

int ordenado(int* arr) {
if (arr[0] == 0) {
return 1;
}
if (arr[0] <= arr[1]) {
return ordenado(arr++);
}
else return 0;
}

最佳答案

抱歉,我的第一个答案不正确。我在下面更正了。

解释

  1. 我在循环之前添加了 scanf("%d", &arr[i]); 以填充 arr[0]
  2. 我更改了 ordenado 函数
    1. 当你点击 0 然后 返回 1
    2. 当你点击 x 但下一个元素是 0 然后 返回 1 (注意 || 是短路。如果你没有命中 0,那么会有下一个元素。所以你也可以在这里检查它是否为 0。)
    3. 一旦两个数字不按顺序返回0(我认为这样更快)
    4. 否则下一个元素不是0并调用ordenado(++arr)(前缀,不是后缀)

关于前缀和后缀的注意事项:

许多编程语言中前缀和后缀的区别在于执行顺序。假设 ij 在两个语句执行前都是 0

i += ++j;

上面的代码等价于此

j = j + 1;
i = i + j;

虽然下面的代码

i += j++;

相当于这个

i = i + j;
j = j + 1;

即在 prefix 中,递增发生在表达式求值之前,而在 postfix 中,递增发生在表达式求值之后。这通常适用于数据类型(即包括指针)。

你的代码行

return ordenado(arr++);

等同于

return ordenado(arr);
a++;

正如@BLUEPIXY 所指出的那样,这会导致无限数量的函数调用。


更正代码

#include <stdio.h>
#include <stdlib.h>
int ordenado(int*);

int main() {
int i = 0, res = 0;
int* arr = NULL;
arr = (int*) malloc(sizeof (int));
scanf("%d", &arr[i]);
while (arr[i] != 0) {
i++;
arr = (int*) realloc(arr, (i + 1) * sizeof (int));
scanf("%d", &arr[i]);
}
res = ordenado(arr);
printf("\n%d ", res);
return 0;
}

int ordenado(int* arr) {
if (arr[0] == 0 || arr[1] == 0)
return 1;
if (arr[0] > arr[1])
return 0;
else
return ordenado(++arr);
}

示例输入和输出:

Input:  0
Output: 1

Input:  1 newline 0
Output: 1

Input:  1 newline 2 newline 3 newline 0
Output: 1

Input:  2 newline 1 newline 0
Output: 0

Input:  1 newline 2 newline 3 newline 2 newline 3 newline 0
Output: 0

关于检查数组的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31395283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com