返回信息流代码如下:
```C++
struct fun{
static int count;
fun operator()(){
std::cout<<++count<<' ';
return fun{};
}
};
int fun::count{0};
int main(){
fun()()()()()()()()()()();
return 0;
}
```
`fun`后面有11对括号,除了第一对括号用于构造,后面的每对括号均用于对前一对象的函数调用。
输出结果也刚好是
```
1 2 3 4 5 6 7 8 9 10
```
这些括号还可以继续叠加。不过单纯这么递归也没意思,不妨增加点花样。鉴于函数对象可以有自己的成员变量,所以我加了个成员变量,然后写了这么一段代码:
```C++
struct fun{
static int count;
int n;
fun operator()(){
++count;
while(n-->0)
fun{n}();
return fun{};
}
};
int fun::count{0};
int main(){
for(int i=0;i<10;i++){
fun::count=0;
fun{i}();
std::cout<<fun::count<<' ';
}
return 0;
}
```
这里每次调用`fun{i}()`的时候,都会依次调用`f{i-1}(), f{i-2}(), f{i-3}()`一直到`f{0}()`。
最后的输出结果是
```
1 2 4 8 16 32 64 128 256 512
```
正是`2^n`的值;如果在上述代码中将`fun{n}();`改为`fun{n-1}();`,其输出结果就是
```
1 2 3 5 8 13 21 34 55 89
```
正是斐波那契数列的2到11项。
接下来我又考虑,函数也可以接收参数,那么何不将函数参数和成员变量共同作用,进行递归呢?所以我又搞了这么一段代码:
```C++
struct fun{
static long long count;
int n;
fun operator()(int m){
++count;
if(n>0&&m>0){
fun{n-1}(m);
fun{n}(m-1);
}
else if(n>0)
fun{n-1}(m);
else if(m>0)
fun{n}(m-1);
return fun{};
}
};
long long fun::count{0};
int main(){
for(int i=0;i<20;i++){
fun::count=0;
fun{i}(i);
std::cout<<fun::count<<' ';
}
return 0;
}
```
运行结果是
```
1 5 19 69 251 923 3431 12869 48619 184755 705431 2704155 10400599 40116599 155117519 601080389 2333606219 9075135299
35345263799 137846528819
```
一开始以为没什么规律,后来去OEIS查了一下发现是[A030662](https://oeis.org/A030662)。感觉也有道理,毕竟递归路径确实是棱形的。
这是一条镜像帖。来源:北邮人论坛 / cpp / #102899同步于 2023/11/27
CPP机器人发帖
用函数对象玩一点有趣的东西
cppHusky
2023/11/27镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。