我发现了一个递归函数,让我有点惊讶这个函数统计出现在数组中的所有负数:
int count_negative(int arr[], int n)
{
if ( n > 0 )
return (*arr < 0) + count_negative( ++arr, n - 1 );
return 0;
}
有人可以解释这一行:
return (*arr < 0) + count_negative( ++arr, n-1 );
谢谢
答案 0 :(得分:6)
(*arr < 0)
将数组的第一个元素与零进行比较。表达式的结果可以是1
(第一个元素是负数)或0
(第一个元素是正数或零)。因此,负数元素的数量是该表达式与数组尾部负数元素数之和。
答案 1 :(得分:3)
*arr
指向arr
数组的第一个元素(或者更准确地说,是在此特定调用中传递给函数的arr
部分)。
count_negative( ++arr, n-1 )
是递归调用但由于++arr
,在此调用中我们计算数组的下一个元素和n-1
参数,并使用if ( n > 0 )
保证我们只计算arr
数组中的元素。
答案 2 :(得分:2)
原则是,不是在被检查的元素上保留索引,因为arr
是指针并且修改它不会改变数据,而是可以使用arr
本身作为迭代器数组数据。
因此,*arr < 0
检查当前指向的元素是否为负数(如果是,它将产生1
,如果不是则产生0
),并且++arr
将光标增加到数组中的下一个位置,然后递归传递以检查数组的其余部分。
这是使用列表的函数式语言中一个众所周知的想法,在这些列表中,您经常处理列表的第一个元素( head )并递归列表的剩余部分(< EM>尾)。