Funktionales C++23 bei der Berechnung der Zeilen im Pascal-DreieckC++

Programme in C++. Entwicklerforum
Guest
 Funktionales C++23 bei der Berechnung der Zeilen im Pascal-Dreieck

Post by Guest »

Ich lerne modernes C++ und bin ein Experte des funktionalen Paradigmas. Hier ist die Situation: Ich möchte die Zeilen im Pascal-Dreieck mit C++23 und seiner Ranges-Bibliothek berechnen.
Hier ist die Implementierung in Haskell (und ich finde die Implementierung extrem schön):

Code: Select all

pascal 0 = [1]
pascal n = zipWith (+) (0:pascal (n-1)) (pascal (n-1) ++ [0])
Die Implementierung stammt von hier.
Das Folgende ist mein Versuch, es in C++23 zu implementieren:

Code: Select all

#include 
#include 
#include 

namespace stdv = std::views;

std::vector triangle_row(int n);
auto add = [](auto a, auto b) {return a + b; };

std::vector triangle_row(int n) {
if (n == 0) {
return {1};
}
else {
auto left = (triangle_row(n-1)).insert(triangle_row(n-1).begin(), 0);
auto right = (triangle_row(n-1)).insert(triangle_row(n-1).end(),0);
auto tri_row = stdv::zip_transform(add, left, right);
return tri_row;
}
}
Der else-Teil in der obigen Implementierung verursacht den folgenden Fehler:

Code: Select all

: In function 'std::vector triangle_row(int)':
:17:41: error: no match for call to '(const std::ranges::views::_ZipTransform) (&, __gnu_cxx::__normal_iterator&, __gnu_cxx::__normal_iterator&)'
17 |       auto tri_row = stdv::zip_transform(add, left, right);
|                      ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
...
Wie könnte ich es (unter Verwendung eines funktionalen Paradigmas; d. h. ohne For-Schleife usw.) korrekt und auf eine schönere Art und Weise implementieren?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post