在二重数组中递归查找负数

Recursively finding a negative in an array of doubles

本文关键字:递归 查找 数组 二重      更新时间:2023-10-16

我的家庭作业要求我遍历一个双精度数组,并根据它是否包含负数返回true或false。问题是我必须使用递归函数,而不能使用循环。我也不能访问给定函数之外的任何函数或变量。

该函数接受两个参数:数组和要检查的元素数。

一旦它检查了指定数量的元素,我就很难让它停止递归。

//what I have so far
bool anyNegative(const double a[], int n)
{
if(n <= 0)
return false;
if(*a < 0)
return true;
anyNegative(a + 1, n);
}

首先,我想到了使用counter,但这不起作用,因为每次函数递归时都会重置它。

我还尝试将指针索引与进行比较

if(currentElement == &a[n])

其中currentElement是指向数组a的第一个元素的指针。

然而,我认为当我这样做的时候,我的程序没有工作的原因是因为每次函数递归时,"a"都被设置为一个新值,所以&a[n]将始终是currentElement前面的n个元素。

我被卡住了,如果有人能给我一个提示,那就太好了。

减小n,因为您传递的数组较小

anyNegative(a + 1, n - 1);

您需要减少n,并返回递归调用的值。

return anyNegative(a + 1, n - 1);

您缺少两件事,第一,您没有递减n的值,以便达到终止条件。其次,您不会将子执行的结果返回到上层。

这是修改后的代码:

//what I have so far
bool anyNegative(const double a[], int n)
{
if(n <= 0)
return false;
if(*a < 0)
return true;
return anyNegative(a + 1, n - 1);
}

数组的大小不能为负数。所以不要做这样多余的检查

if(n <= 0)
return false;

最好将第二个参数定义为具有sizet类型。

您的函数有未定义的行为,因为当控件将实现语句时,它什么也不返回

anyNegative(a + 1, n);

而且必须是而不是上面的呼叫

anyNegative(a + 1, n -1);

我会用以下方式编写函数

bool anyNegative( const double a[], size_t n )
{
if ( n == 0 ) return false;
return ( *a < 0 ? true : anyNegative( a + 1, n - 1 ) );
}