我有一個功能
int f(int);
我想得到
[0, f(0), f(f(0)), f(f(f(0))), ...]
直到 f 回傳 -1。我想知道在函式式編程中是否有這個名字。它看起來像遞回。
uj5u.com熱心網友回復:
range-v3 中最接近于執行此操作views::partial_sum1。這需要一個二進制函式,將其應用于目標范圍中的前一個元素和源范圍中的下一個元素的結果。
但是在這里,我們可以簡單地忽略源范圍中的下一個元素,因為我們不關心它——只關心前一個元素:
auto recurrence =
rv::iota(0)
| rv::partial_sum([](int prev, int){
return f(prev);
})
| rv::take_while([](int i){
return i != -1;
})
iota(0)給你范圍[0, 1, 2, ...]。后面的內容實際上并不重要0,只是它們是無限的。rv::repeat(0)也有效,這只是范圍[0, 0, 0, ...]
然后partial_sum給你范圍[0, f(0), f(f(0)), f(f(f(0))), ...]
然后take_while在我們到達時停止-1。請注意,結果-1中不包含它 - 如果你想包含它,構造是......更棘手。
不過,一般來說,使用生成器更容易完成這種事情:
auto recurrence() -> generator<int> {
int i = 0;
while (i != -1) {
co_yield i;
i = f(i);
}
}
如果您想包含以下內容,這也更容易重組-1:
auto recurrence() -> generator<int> {
int i = 0;
while (true) {
co_yield i;
if (i == -1) {
break;
}
i = f(i);
}
}
1 range-v3 has views::generate,但它需要一個空函式 - 它為您提供 range [f(), f(), f(), ...],但允許f()每次回傳不同的值。我想我們可以用它來做:
views::generate([cur=0, next=0]() mutable {
cur = next;
next = f(next);
return cur;
})
我們可以建立一個:
auto generate_unary = [](auto init, auto f){
return views::generate([cur=init, next=init, f]() mutable {
cur = next;
next = f(next);
return cur;
});
};
然后我們可以generate_unary(0, f)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515674.html
上一篇:回傳具有隨機X值的陣列的遞回函式
