有逻辑运算符时,谁能向我解释此返回如何工作?还解释一下该函数何时返回自身和数组元素?
#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);
}
答案 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;
何时该函数将返回自身以及何时数组元素
它从不做任何一个。它总是返回一个整数。
这个想法似乎是该函数通过一个数组查找三个值分别为x
,y
和z
的连续元素。
如果找到,则返回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 循环就一样简单,而且速度更快。