gpt4 book ai didi

recursion - 短路运算符和尾递归

转载 作者:行者123 更新时间:2023-12-04 15:47:26 25 4
gpt4 key购买 nike

假设我有一个简单的函数,如下所示:

int all_true(int* bools, int len) {
if (len < 1) return TRUE;
return *bools && all_true(bools+1, len-1);
}

可以按以下更明显的尾部递归样式来重写此函数:
int all_true(int* bools, int len) {
if (len < 1) return TRUE;
if (!*bools) return FALSE;
return all_true(bools+1, len-1);
}

从逻辑上讲,两者之间的差异为零;假设 bools仅包含 TRUEFALSE(明智地定义),它们的作用完全相同。

我的问题是:如果编译器足够聪明,可以将第二个优化为尾递归调用,那么考虑到“&&”短路,可以期望它以相同的方式优化第一个吗?显然,如果使用非短路运算符,则这将不会是尾递归的,因为两个表达式都将在运算符应用之前就被求值,但是我对短路情况感到好奇。

(在收到大量评论告诉我,C编译器通常不优化尾递归调用之前:将其视为关于使用短路运算符独立于语言来优化尾递归调用的一般问题。我会很高兴用Scheme,Haskell,OCaml,F#,Python或不了解C的东西重写它。)

最佳答案

您的问题确实是“编译器有多聪明?”但您未说明您使用的是哪个编译器。

给定一个假设的合理的编译器,该编译器在优化之前将源代码转换为中间流程图,则您编写的代码的两个片段都可以用相同的方式表示(&&运算符虽然易于键入,但编译起来却不如&运算符;因此,如果在假设的编译器中将其扩展为一个阶段,我不会感到惊讶。根据该假设,可以断言您问题的答案是"is"。

但是,如果您实际上要依赖于此,则应使用碰巧使用的任何编译器对其进行测试。

关于recursion - 短路运算符和尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com