为啥这个函数不会陷入无限循环? [复制]

Posted

技术标签:

【中文标题】为啥这个函数不会陷入无限循环? [复制]【英文标题】:Why doesn't this function get stuck in an infinite loop? [duplicate]为什么这个函数不会陷入无限循环? [复制] 【发布时间】:2020-04-02 01:06:46 【问题描述】:

这个函数来自我教授的笔记:

int ints_is_sorted_r(int* a, int n)
    return n <= 1 || (a[0] <= a[1] && ints_is_sorted_r(a+1, n-1));

这是我的带有许多 printfs 的版本,看看它的作用

int ints_is_sorted_r(int* a, int n)

    printf("n <= 1 = %d\n",(n <=1));
    printf("a[0] <= a[1] = %d <= %d\n",a[0],a[1]);
    ints_println_special(a,n);
    return n <= 1 || (a[0] <= a[1] && ints_is_sorted_r(a+1, n-1));


(ints_println_special() 是我教授库中的一个函数,用于打印整个数组)

我的问题是,递归是如何停止的?这是我的测试的输出:

我的猜测是,当您有 OR 条件并且第一个条件为真时,它不会浪费时间寻找条件的右侧,因为它知道无论如何它都会为真。我说的对吗?

【问题讨论】:

谷歌“短路评估”。见softwareengineering.stackexchange.com/questions/201896/…。 @Carcigenicate: OR if first evaluand is TRUE // AND if first evaluand is FALSE will both短路。 @Carcigenicate 不用担心!如果 S.O. 上有“哎呀”徽章,我已经赚了几个金徽章了。 ???此外,您的评论帮助我改进了我的答案(PS)-希望您不介意。 提示:将文本发布为图片而不是文本会吸引反对票。文本作为文本更有用。 【参考方案1】:

我的猜测是,当您有 OR 条件并且第一个条件是 是的,它不会浪费时间寻找条件的右侧 因为它知道无论如何它都会是真的。我说的对吗?

是的,你是对的!它被称为“短路”,Stack Overflow 上有几个很好的帖子解释和讨论它,比如this one。

PS:请注意,在|| 运算符之后的部分内部也可能(可能会)发生这种短路;因此,在(a[0] &lt;= a[1] &amp;&amp; ints_is_sorted_r(a+1, n-1)) 中,如果第一个比较a[0] &lt;= a[1]FALSE,则不会计算第二个比较,并且在这种情况下不会递归调用该函数。

【讨论】:

如果您认为另一个问题的答案会更好地解释它,您应该投票关闭作为该问题的重复而不是回答。

以上是关于为啥这个函数不会陷入无限循环? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

HAL_Delay() 陷入无限循环

为啥这个异步函数无限循环?

为啥当我实现以 2^20 为底的基数排序以对大小为 500 万的数组进行排序时,该程序会陷入无限循环?

JavaScript - 最大的公约数 - 陷入无限循环

为啥这段代码会进入无限循环? [复制]

如果依赖项中存在无法解决的冲突,则 Pip 安装会陷入无限循环