用逻辑运算符返回值

时间:2020-04-19 16:22:39

标签: c recursion return-value logical-operators

有逻辑运算符时,谁能向我解释此返回如何工作?还解释一下该函数何时返回自身和数组元素?

#include<stdio.h>
int consecutive_3(int x, int y, int z, int a[], int n)
{
    if(n<3)
       return 0;
    return ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) || consecutive_3(x, y, z, a, n-1);
}

3 个答案:

答案 0 :(得分:1)

应该相同

int consecutive_3(int x, int y, int z, int a[], int n)
{
    if (n < 3)
       return 0;

    if ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z))
       return 1;

    return consecutive_3(x, y, z, a, n - 1);
}

注意:c从左到右评估逻辑表达式,并且&&||具有higher precedence(首先被评估)。

答案 1 :(得分:1)

在有逻辑运算符的情况下,返回如何工作

return没什么特别的-它仅在表达式被求值后返回表达式的值。

所以在您的情况下:

return ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) || consecutive_3(x, y, z, a, n-1);

相同
int temp = ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) || consecutive_3(x, y, z, a, n-1);
return temp;

何时该函数将返回自身以及何时数组元素

它从不做任何一个。它总是返回一个整数。

这个想法似乎是该函数通过一个数组查找三个值分别为xyz的连续元素。

如果找到,则返回1。

如果找不到,它会自我调用,但会查看数组中的新点,即下一个较低的数组索引。这一直持续到搜索完整个数组为止。

如果仍然找不到,它将返回0。这就是if (n < 3) return 0;的作用。

所以假设数组:

int a[] = {1, 2, 3, 4, 5, 6};

和函数调用

consecutive_3(1, 2, 3, a, 6);

那么你就这样

 Is 1, 2, 3 equal 4, 5, 6 No, so call again
 Is 1, 2, 3 equal 3, 4, 5 No, so call again
 Is 1, 2, 3 equal 2, 3, 4 No, so call again
 Is 1, 2, 3 equal 1, 2, 3 Yes, return 1

打过电话

consecutive_3(10, 2, 3, a, 6);

应该是

 Is 10, 2, 3 equal 4, 5, 6 No, so call again
 Is 10, 2, 3 equal 3, 4, 5 No, so call again
 Is 10, 2, 3 equal 2, 3, 4 No, so call again
 Is 10, 2, 3 equal 1, 2, 3 No, so call again
 No more unchecked elements so return 0

答案 2 :(得分:0)

此函数检查数组a []中从索引0到n-1是否存在3个连续数字x y z。它返回0(未找到)或1(找到)。

首先,进行了超出范围的检查:

if (n < 3)
   return 0;  // there are less than 3, can not match

然后,测试最后三个数字:

return ((a[n-3] == x) && (a[n-2] == y) && (a[n-1] == z)) (|| ...)

如果三个都匹配,则返回1作为值。但是,如果不是,它将在||之后返回表达式的右部分。 (逻辑或)。

该部分再次调用相同的函数,但是缩短了数组,因此它再次测试了缩短后的数组的最后3个。

了解这一点的关键是 return 在两个兼容的替代方案之间进行选择(均为布尔值);第一个是预期(但部分)测试,第二个是仅在第一个失败的情况下对不同数据执行的预期测试。

这是一个聪明的系统,但是由于一次又一次地调用自身,增加堆栈压力和传递参数的开销,所以速度不是很快。单个 for 循环就一样简单,而且速度更快。

相关问题