为啥这个函数不会陷入无限循环? [复制]
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] <= a[1] && ints_is_sorted_r(a+1, n-1))
中,如果第一个比较a[0] <= a[1]
是FALSE
,则不会计算第二个比较,并且在这种情况下不会递归调用该函数。
【讨论】:
如果您认为另一个问题的答案会更好地解释它,您应该投票关闭作为该问题的重复而不是回答。以上是关于为啥这个函数不会陷入无限循环? [复制]的主要内容,如果未能解决你的问题,请参考以下文章