如何在某个级别停止递归函数并在那里插入另一个函数?
Posted
技术标签:
【中文标题】如何在某个级别停止递归函数并在那里插入另一个函数?【英文标题】:How can I stop a recursive function at a certain level and insert another function there? 【发布时间】:2020-08-03 07:02:06 【问题描述】:我有 2 个问题:我有一个递归函数 M(n)=3*M(n/2)+2*n+1
和一个迭代函数 T(n)=n^2
#include<stdlib.h>
#include<bits/stdc++.h>
using namespace std;
int M(int n)
if (n == 1)
return n;
return 3*M(n/2)+2*n+1;
int T(int n)
return n^2;
int main ()
cout<< "Cost is "<< M(768)<<"\n";
getchar();
return 0;
我想为n=768
运行5级递归M
函数,然后插入T
函数如下:
M(768)=3*M(384)+O(n)
M(384)=3*M(192)+O(n)
M(192)=3*M(96)+O(n)
M(96)=3*M(48)+O(n)
M(48)=3*M(24)+O(n)
现在我希望我的程序在n=24
处停止并插入$T(24)=24^2$
而不是M(24)
。
换句话说,我想以这种方式组合 M(n) 和 T(n) 函数。
但我无法以这种方式安排递归代码。有人可以帮我弄这个吗?我是否需要将 M(n) 转换为迭代函数来实现我的目标,或者我可以只修复递归吗?如果是这样,如何转换为迭代函数?
我的第二个问题是:
如果我运行M(n)
的代码直到基本情况n=1
,我得到一个错误,因为768=3*256
和3 不能被2 整除。如何仅针对 M(n) 解决此问题?
【问题讨论】:
是否总是在 5 次递归之后?或者当输入它48
? 24
?
“如何在某个级别停止递归函数” - 计算递归深度并在达到“最大深度”时退出(或执行任何操作),会是一个明显的解决方案..
@idclev463035818 实际上我的最终目标是能够将 5 值更改为任何其他值。但现在 5 就可以了。迭代次数是我希望能够更改的值。不是 24 或 48。而是那里的迭代次数是 5。
@esra 维护一个计数器,该计数器从零开始,每次递归时递增。如果柜台是>= 5
bail out.
^ 不是幂函数。
【参考方案1】:
让我们摆脱一些细节,这样我们就可以专注于基本要素。考虑你有这个递归函数:
int foo(int n)
std::cout << "foo(" << n << ")\n";
// base case
if (n <= 1) return 1;
// recurse
return foo( n-2 );
在 5 次递归之后你想调用其他函数
int bar(int n)
std::cout << "bar(" << n << ")\n";
return 42;
然后你只需要添加一个参数来选择在多少步之后应该调用另一个函数,以及一个计算递归的计数器:
int foofoo(int n, int steps,int counter=1)
std::cout << "foofoo(" << n << '\n';
if (counter == steps) return bar(n);
if (n <= 1) return 1;
foofoo(n-2,steps,counter+1);
然后
int main()
foofoo(12,5);
打印
foofoo(12)
foofoo(10)
foofoo(8)
foofoo(6)
bar(4)
PS:^
是按位异或,得到n
的平方写入n*n
。
【讨论】:
不应该 foofoo() 有 3 个参数吗?我错了吗?实际上,我想要得到的正是将 T(24) 插入 M(24) 并得到这个结果。 M(768)=3*3*3*3*3*M(24)+O(n)=3*3*3*3*3*T(24)+O(n)=结果。如何将 bar(4) 插入 foofoo(12) 而不是 foofoo(4)?顺便感谢按位或更正和代码。 @esra 第三个使用默认值。以上是关于如何在某个级别停止递归函数并在那里插入另一个函数?的主要内容,如果未能解决你的问题,请参考以下文章