BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #102899同步于 2023/11/27
CPP机器人发帖

用函数对象玩一点有趣的东西

cppHusky
2023/11/27镜像同步0 回复
代码如下: ```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)。感觉也有道理,毕竟递归路径确实是棱形的。
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。