【问题标题】:Return value with logic operators使用逻辑运算符返回值
【发布时间】:2020-04-19 16:22:39
【问题描述】:

谁能向我解释当有逻辑运算符时这个返回是如何工作的?还要解释一下这个函数什么时候返回自己和数组元素?

#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);
}

【问题讨论】:

    标签: c recursion return-value logical-operators


    【解决方案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 从左到右计算逻辑表达式,&amp;&amp;|| 有一个 higher precedence(首先计算)。

    【讨论】:

    • 除了最后一个return 需要!= 0? 1 : 0 什么的。
    • @aschepler 为什么? consecutive_3 已经返回 0 或 1
    • 公平点。我更多地考虑的是表达式/语句的确切等价,而不是特定的上下文。
    【解决方案2】:

    在这种情况下,当有逻辑运算符时,return 是如何工作的

    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;
    

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

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

    这个想法似乎是该函数通过一个数组查找 3 个连续元素,其值为 xyz

    如果找到,则返回 1。

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

    如果仍未找到,则返回 0。这就是 if (n &lt; 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
    

    【讨论】:

      【解决方案3】:

      此函数检查数组 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 循环同样简单,而且速度更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 2021-07-06
        • 2018-12-18
        • 1970-01-01
        • 2023-02-22
        相关资源
        最近更新 更多