Сокращенные операторы и хвостовая рекурсия

Допустим, у меня есть простая функция вроде этой:

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 содержит только TRUE или FALSE (разумно определено), они делают то же самое.

Мой вопрос: если компилятор достаточно умен, чтобы оптимизировать второй как хвостовой рекурсивный вызов, разумно ли ожидать, что он оптимизирует первый таким же образом, учитывая, что "&&" замыкается? Очевидно, что если бы использовался оператор без короткого замыкания, он не был бы хвостовой рекурсией, потому что оба выражения были бы вычислены до того, как оператор даже будет применен, но мне любопытно случай короткого замыкания .

(Прежде чем я получу поток комментариев о том, что компиляторы C обычно не оптимизируют хвостовые рекурсивные вызовы: считайте это общим вопросом об оптимизации хвостовых рекурсивных вызовов с помощью операторов короткого замыкания, независимо от языка. I Буду счастлив переписать это на Scheme, Haskell, OCaml, F #, Python или на чем-нибудь еще, если вы не понимаете C.)

6
задан koschei 15 December 2011 в 04:08
поделиться