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

如何在C++中递归实现int类型数组的length长度计算函数

递归实现C++ int数组长度统计方案

前置说明

C++ 原生数组和Prolog内置列表存在本质差异:原生数组作为参数传递给函数时会退化为指针,丢失长度边界信息,因此无法直接像Prolog那样通过空列表判断终止,需要额外补充边界判断逻辑。

以下两种实现均完全对应你提到的Prolog双分支逻辑:基准终止分支+递归拆分分支。

方案1:双指针递归实现(无侵入,推荐)

  • 基准终止分支:当首指针等于尾边界指针时,返回0(对应Prolog的length([], 0)逻辑)
  • 递归分支:取当前首指针对应元素作为Head,首指针+1后的区间作为Tail,返回 1 + 递归计算Tail的长度(对应Prolog的列表拆分计数逻辑)

实现代码如下:

#include <iostream>
using namespace std;

// 递归核心逻辑
int length(const int* begin, const int* end) {
    if (begin == end) {
        return 0;
    }
    return 1 + length(begin + 1, end);
}

// 模板封装:自动推导静态数组边界,调用时无需手动传入首尾指针
template<size_t N>
int length(const int (&arr)[N]) {
    return length(arr, arr + N);
}

int main() {
    int arr[5] = {1,2,3,4,5};
    cout << "Length is: " << length(arr) << endl;
    return 0;
}

该方案无需修改数组本身,运行效率高,静态数组场景下的调用方式和你给出的示例完全一致。

方案2:哨兵标记递归实现

如果希望保持单参数的函数签名,可以参考C字符串的\0终止逻辑,给数组末尾添加一个业务中不会出现的特殊值作为哨兵,作为终止判断标记:

#include <iostream>
#include <climits>
using namespace std;

int length(const int* arr) {
    // 基准条件:遇到哨兵标记返回0
    if (*arr == INT_MIN) {
        return 0;
    }
    // 递归分支:当前元素计数+1,剩余部分递归计算
    return 1 + length(arr + 1);
}

int main() {
    // 数组末尾预留哨兵位置
    int arr[6] = {1,2,3,4,5, INT_MIN};
    cout << "Length is: " << length(arr) << endl;
    return 0;
}

该方案函数签名和你最初的写法一致,但需要确保哨兵值不会和正常业务元素重复,否则会出现统计错误。

语法修正说明

你给出的示例代码存在两处语法问题:

  • 指针参数写法错误,应为int* arr而非*int arr
  • 函数名拼写错误,lenght应为length

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:54:02