我的家庭作业要求我经历一系列双打并返回真或假,具体取决于它是否包含负数。问题是我必须使用递归函数,我不能使用循环。我也不能使用访问我给出的函数之外的任何函数或变量。
该函数有两个参数:数组和要检查的元素数。
一旦检查了指定数量的元素,我就无法停止递归。
//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);
}
首先,我想过使用计数器,但这不起作用,因为每次函数递归都会重置。
我还尝试将指针索引与
进行比较if(currentElement == &a[n])
其中currentElement是指向数组a的第一个元素的指针。
但是,我认为当我这样做时我的程序不起作用的原因是因为每次递归函数时“a”被设置为一个新值,因此&amp; a [n]将始终是n个元素of currentElement。
我被困住了,如果有人能给我一个提示,那就太好了。
答案 0 :(得分:1)
降低n
,因为传递的数组较小
anyNegative(a + 1, n - 1);
答案 1 :(得分:1)
您需要减少n
,并返回递归调用的值。
return anyNegative(a + 1, n - 1);
答案 2 :(得分: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);
}
答案 3 :(得分:0)
数组的大小不能为负数。所以不要做这样多余的检查
if(n <= 0)
return false;
最好将第二个参数定义为类型size_t。
您的函数具有未定义的行为,因为当控件将实现语句
时它不返回任何内容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 ) );
}