如何编写C程序来使用递归计算数组的长度

n6lpvg4x  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(153)

我正在尝试用C语言编写一个递归程序来求数组的长度。
虽然我见过Python中的解决方案,但我无法在C中应用它们。
我写了一段代码:

int elementcounter(int *arr, int n)
{   
    if(arr[n] == '\0')
    {
        return 0;
    }
    else
    {
     
        return ( 1+elementcounter(arr, (n+1)));
    }

}

但它没有给出正确的答案。我已经打印了它:

printf("the total elements are %d\n", (elementcounter(arr, 0)-1));
y1aodyip

y1aodyip1#

只有当你有一个特定的数组终止符元素时才能这么做,比如字符串的null终止符,这是因为一旦你把一个数组传递给一个函数,你所剩下的就是一个指针,而且它只是一个指向单个值的指针。
如果你有一个终止符元素,那么就检查一下,如果没有找到,就递归调用,索引加1,如果找到了终止符,就返回0,否则就返回1加上递归调用的结果。
如果数组中没有终止符元素,那么就不可能使用递归或普通循环来完成。
还要注意,除非在编写代码时考虑到tail-recursion,并且编译器实际上执行尾递归,否则如果数组太长而导致递归太深,则可能存在堆栈溢出的风险。

uujelgoq

uujelgoq2#

当将数组传递给函数时,如果不知道数组中有多少个元素,函数不走到数组末尾的唯一方法是有一个特殊的(和额外的)* sentinel * 值标记数组的末尾。
我对你的代码做了一些修改并添加了一些额外的东西。

#include <stdio.h>
#include <limits.h>

#define SENTINEL INT_MIN // an unlikely but not impossible integer value

int elementcounter( int *arr, int n ) {
    return arr[n] == SENTINEL ? 0 : 1 + elementcounter( arr, n+1 );
}

int main() {
    int arr[] = { 42, 0, 23, 1024, -57, 45678, SENTINEL };

    int n = elementcounter( arr, 0 );

    printf( "# of elements: %d\n(%d really when accounting for the terminator.)\n", n, n+1 );

    printf( "The compiler says there are %d elements in this array.\n", sizeof arr / sizeof arr[0] );

    return 0;
}
# of elements: 6
(7 really when accounting for the terminator.)
The compiler says there are 7 elements in this array.

将"bottom of the recursion"返回值从0改为1意味着函数也正确地计算了sentinel元素。它是数组的部分。

    • 编辑:**

下面是一个迭代代码片段,它不会使用递归来遍历堆栈。最简单的解决方案就是最好的解决方案。

int n = 0;
    while( arr[n] != SENTINEL ) n++;
    n++; // the uncounted sentinel element

    printf( "# of elements: %d\n", n );

相关问题