In dem Buch Accelerated C++ Programmierung, auf Seite 205, gibt es die beiden folgenden Umsetzung find
Was ist der Unterschied zwischen einer rekursiven Version von "find" und einer nicht rekursiven Version?
template <class In, class X> In find(In begin, In end, const X& x)
Ich bin interessiert zu wissen, was in Bezug auf die Leistung jeder Unterschied ist (ob es tatsächlich das gleiche nach ist die Kompilierung?) der folgenden zwei Implementierungen.
nicht-rekursive
template <class In, class X> In find(In begin, In end, const X& x)
{
while (begin != end && *begin != x)
++begin;
return begin;
}
rekursive
template <class In, class X> In find(In begin, In end, const X& x)
{
if (begin == end || *begin == x)
return begin;
begin++;
return find(begin, end, x);
}
Durch die Verwendung von Compiler Explorer von Kerrek schlug ich bekam die folgende
nicht-rekursive https://godbolt.org/g/waKUF2
rekursive https://godbolt.org/g/VKNnYZ
Es scheint genau dasselbe nach der Kompilierung zu sein? (Wenn ich das Tool richtig verwende .. Sorry, ich bin sehr neu in C++)
Warum versuchst du nicht einfach beide und * sag uns * was du findest? –
Tail-Rekursion kann zu netten, sauberen Lösungen führen, aber Sie sollten besser hoffen, dass Ihr Compiler das in einer Schleife optimiert anstatt rekursiv (was so ziemlich alle Compiler tun, wenn sie die notwendigen Optimierungsflags übergeben, aber wahrscheinlich nicht, wenn Optimierungen sind) ausgeschaltet (wie in einem Debug-Build)). Andernfalls könnten Sie einen Stapelüberlauf erhalten, wenn Sie eine lange Liste suchen. – Cornstalks
[Beispiel] (https://godbolt.org/g/Ql4X3d) –