我正在尝试用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));
2条答案
按热度按时间y1aodyip1#
只有当你有一个特定的数组终止符元素时才能这么做,比如字符串的null终止符,这是因为一旦你把一个数组传递给一个函数,你所剩下的就是一个指针,而且它只是一个指向单个值的指针。
如果你有一个终止符元素,那么就检查一下,如果没有找到,就递归调用,索引加1,如果找到了终止符,就返回
0
,否则就返回1
加上递归调用的结果。如果数组中没有终止符元素,那么就不可能使用递归或普通循环来完成。
还要注意,除非在编写代码时考虑到tail-recursion,并且编译器实际上执行尾递归,否则如果数组太长而导致递归太深,则可能存在堆栈溢出的风险。
uujelgoq2#
当将数组传递给函数时,如果不知道数组中有多少个元素,函数不走到数组末尾的唯一方法是有一个特殊的(和额外的)* sentinel * 值标记数组的末尾。
我对你的代码做了一些修改并添加了一些额外的东西。
将"bottom of the recursion"返回值从0改为1意味着函数也正确地计算了sentinel元素。它是数组的部分。
下面是一个迭代代码片段,它不会使用递归来遍历堆栈。最简单的解决方案就是最好的解决方案。