#include <iostream>
#include <vector>
#include <numeric>
#include <variant>
#include <functional>
#include <utility>
// --- (Paste the Bounce, Step, and trampoline definitions from above here) ---
template<typename T>
struct Bounce;
template<typename T>
using Step = std::variant<T, Bounce<T>>;
template<typename T>
struct Bounce {
std::function<Step<T>()> thunk;
};
template<typename T>
T trampoline(Step<T> first_step) {
Step<T> current_step = std::move(first_step);
while (std::holds_alternative<Bounce<T>>(current_step)) {
current_step = std::get<Bounce<T>>(current_step).thunk();
}
return std::get<T>(current_step);
}
// --- (Paste the sum_trampolined function from above here) ---
Step<long> sum_trampolined(const std::vector<long>& data, size_t index, long current_sum) {
if (index == data.size()) {
return current_sum;
}
return Bounce<long>{
[=]() {
return sum_trampolined(data, index + 1, current_sum + data[index]);
}
};
}
int main() {
// This will now work without crashing!
std::vector<long> large_vec(200000, 1);
// To start the process, we create the very first step.
Step<long> first_step = sum_trampolined(large_vec, 0, 0);
// The trampoline function runs the computation to completion.
long total = trampoline(first_step);
std::cout << "Trampolined sum of large vector: " << total << std::endl;
std::cout << "The program finished successfully." << std::endl;
return 0;
}
Oct 4, 2025
[alrotighm] trampoline pattern
using trampoline to deal with recursive stack overflow situation(while tail-call is not applicable):
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.