You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断两个数组是否互为逆序?现有C语言代码故障求排查

问题:判断两个指定长度数组是否互为逆序

需求:判断两个指定长度的数组是否互为逆序,例如数组A[3] = {1, 2, 3}与数组B[3] = {3, 2, 1}。若互为逆序返回1,否则返回0。

以下是我编写的代码,但无法正常运行:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int* input_array(int);
int areReversed(int*, int*, int);

int main()
{
    int n = 0;
    int* A, * B;
    printf("please enter the size of arrays: \n");
    scanf("%d", &n);
    printf("please enter elements of the first array: \n");
    A = input_array(n);
    printf("please enter elements of the second array: \n");
    B = input_array(n);
    areReversed(A, B, n) ? printf("Arrays are the opposite to one another.\n") : printf("Arrays are not the opposite to one another.\n");
    free(A); free(B);
}

int areReversed(int* A, int* B, int n) {
    int i = 0, j = n-1;
    int reverse = 0;
    if (n > 1)
    {
        for (i = 0, j = 0; i < n && j >= 0; i++, j--)
        {
            if (A[i] == B[j])
            {
                return areReversed(A + 1, B + 1, n);
            }
            if (A[i] != B[j])
                return 0;

        }
        return 1;
    }
}

代码问题排查

  • 循环初始化错误:j被初始化为0,执行j--后直接变为-1,循环条件j >= 0不满足,循环体完全不会执行。
  • 递归逻辑混乱:递归调用areReversed(A + 1, B + 1, n)时,既没有对应到第二个数组的逆序位置,也没有缩小问题规模(n保持不变),会导致无限递归,最终栈溢出。
  • 返回值不完整:当n <= 1时,函数没有返回语句,属于未定义行为,程序可能返回随机值。
  • 逻辑冗余:同时混用循环和递归,逻辑重叠导致判断逻辑失效。
  • 函数缺失实现:input_array只有声明没有定义,编译时会报错。

解决方案

修复后的递归版本

递归核心思路:每次判断数组首元素与另一数组的尾元素是否相等,然后缩小数组范围(首指针后移、问题长度减2),直到长度为0或1时返回1。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int* input_array(int);
int areReversed(int*, int*, int);

int main()
{
    int n = 0;
    int* A, * B;
    printf("请输入数组大小:\n");
    scanf("%d", &n);
    printf("请输入第一个数组的元素:\n");
    A = input_array(n);
    printf("请输入第二个数组的元素:\n");
    B = input_array(n);
    areReversed(A, B, n) ? printf("两个数组互为逆序。\n") : printf("两个数组不互为逆序。\n");
    free(A); free(B);
}

// 补充input_array函数实现
int* input_array(int n) {
    int* arr = (int*)malloc(n * sizeof(int));
    assert(arr != NULL);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    return arr;
}

int areReversed(int* A, int* B, int n) {
    // 长度为0或1时,必然满足逆序
    if (n <= 1) {
        return 1;
    }
    // 判断首元素与另一数组的尾元素是否相等
    if (A[0] != B[n-1]) {
        return 0;
    }
    // 递归判断缩小后的子数组
    return areReversed(A + 1, B, n - 2);
}

更高效的迭代版本

迭代版本更直观,避免递归栈溢出风险:

// 替换原areReversed函数即可
int areReversed(int* A, int* B, int n) {
    for (int i = 0; i < n; i++) {
        // 第i个元素对应第二个数组的第n-1-i个元素
        if (A[i] != B[n - 1 - i]) {
            return 0;
        }
    }
    return 1;
}

内容的提问来源于stack exchange,提问作者EraoS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:50:19