此功能来自我教授的笔记:
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));
}
这是我的版本,其中包含许多printfs,以查看其作用
$"'{customer_id}'"
(ints_println_special()是我教授的库中的函数,可打印整个数组)
我的问题是,递归如何停止?这是我测试的输出:
我的猜测是,当您有一个OR条件且第一个条件为true时,它不会浪费时间寻找条件的右侧,因为它知道无论如何都会如此。我说得对吗?
答案 0 :(得分:1)
我的猜测是,当您具有OR条件且第一个条件是 没错,寻找条件的正确性并不会浪费时间 因为它知道无论如何都会如此。我说得对吗?
是的,您是对的!这被称为“短路”,并且在Stack Overflow上有好几篇不错的文章来解释和讨论它,例如this one。
PS:请注意,||
运算符之后的部分内部也可能(可能会)发生这种短路;因此,在(a[0] <= a[1] && ints_is_sorted_r(a+1, n-1))
中,如果第一个比较a[0] <= a[1]
是FALSE
,则将不计算第二个比较,并且在这种情况下不会递归调用该函数。 / p>