草庐IT

RECURSION

全部标签

C++11 快速 constexpr 整数幂

在这里打死马。在C中进行整数幂运算的典型(且快速)方法是这种经典方法:int64_tipow(int64_tbase,intexp){int64_tresult=1;while(exp){if(exp&1)result*=base;exp>>=1;base*=base;}returnresult;}但是我需要一个编译时整数幂,所以我继续使用constexpr进行递归实现:constexprint64_tipow_(intbase,intexp){returnexp>1?ipow_(base,(exp>>1)+(exp&1))*ipow_(base,exp>>1):base;}const

c++ - 使用递归和回溯生成所有可能的组合

我正在尝试实现一个类,该类将在给定多个元素和组合大小的情况下生成所有可能的无序n元组或组合。换句话说,当调用这个时:NTupleUnorderedunordered_tuple_generator(3,5,print);unordered_tuple_generator.Start();print()是在构造函数中设置的回调函数。输出应该是:{0,1,2}{0,1,3}{0,1,4}{0,2,3}{0,2,4}{0,3,4}{1,2,3}{1,2,4}{1,3,4}{2,3,4}这是我目前所拥有的:classNTupleUnordered{public:NTupleUnordered(

c++ - 在递归 C++ 函数中捕获 "Stack Overflow"异常

是否可以在递归C++函数中捕获堆栈溢出异常?如果是,怎么办?那么在这种情况下会发生什么voiddoWork(){try(){doWork();}catch(...){doWork();}}我不是在寻找特定操作系统的答案。一般情况下 最佳答案 这本身并不是一个异常(exception),但如果您只是想将堆栈使用量限制在固定数量,您可以这样做:#include//Thesewillbesetatthetopofmain()staticchar*_topOfStack;staticint_maxAllowedStackUsage;intG

c++ - 堆栈溢出错误或异常?

为什么下面的代码没有错误?voidfunc(){func();}intmain(){func();} 最佳答案 理论上,它会溢出堆栈(因为,即使不使用局部变量,每次调用都会将之前的返回地址添加到堆栈中);在实践中,启用优化后,它不会因为tailcalloptimization而溢出,这实际上避免了在跳转中转换调用的任何资源消耗,因此不消耗堆栈。这很容易被examiningtheoptimizedassembly看到由OP代码生成:func():.L2:jmp.L2main:.L4:jmp.L4func针对无限循环进行了优化,包括“独

c++ - g++中的尾递归问题

我正在研究C++中的尾递归函数,并且在使用g++编译器时遇到了一些问题。当numbers[]的大小超过几百个整数时,以下代码会导致堆栈溢出。检查g++为以下内容生成的汇编代码表明twoSum_Helper正在对其自身执行递归call指令。问题是以下哪项导致了这种情况?我忽略了以下阻止尾递归的错误。我在使用g++时犯了一个错误。g++编译器中的尾递归函数检测缺陷。我正在通过带有g++4.5.0的MinGW在WindowsVistax64上使用g++-O3-Wall-fno-stack-protectortest.c进行编译。structresult{inti;intj;boolfound

c++ - 查找最大递归深度

有没有办法在C++中知道最大递归深度,而无需显式调用递归直到它崩溃?我已经看到它受堆栈大小的限制。也许在特定的递归级别查找堆栈中的可用空间量可能很有用。可能吗? 最佳答案 我现在唯一能想到的就是使用getrlimit来获取专用于您的进程的堆栈的最大大小。接下来要做的是找到一种获取当前使用的堆栈大小的方法。我以为getrusage是要走的路,但在查看了man-page和SO上的一些帖子后,它似乎不再支持此特定功能。所以你得另辟蹊径。我相信Valgrind也会报告堆栈使用情况,因此查看其源代码和文档可能会很有用。一旦您能够获得当前筹码量

c++ - 如果

我最近尝试使用C++17并发现:templatevoidrecurse(){ifconstexpr(i==0)return;returnrecurse();}正在尝试调用recurse();会导致fatalerror:templateinstantiationdepthexceedsmaximumof900(use-ftemplate-depth=toincreasethemaximum)returnrecurse();添加else修复错误:templatevoidrecurse(){ifconstexpr(i==0)return;elsereturnrecurse();}这是一个错误

c++ - 创建 N 嵌套 for 循环

有没有办法创建表单的for循环for(inti=0;i在编译时不知道N。理想情况下,我试图找出一种方法来循环遍历数字vector的单独元素,以在一定数量的数字被不同数字替换的情况下创建每个可能的数字。 最佳答案 您可以使用递归代替基本条件-voiddoRecursion(intbaseCondition){if(baseCondition==0)return;//placeyourcodeheredoRecursion(baseCondition-1);}现在您不需要在编译时提供baseCondition值。您可以在调用doRecu

c++ - Visual Studio 中 C++ 中 chkstk.asm stackoverflow 异常的建议

我正在研究合并排序的实现。我正在尝试使用C++VisualStudio2010(msvc)。但是当我用一个包含300000个整数的数组进行计时时,它显示了一个未处理的stackoverflow异常并将我带到一个名为“chkstk.asm”的只读文件。我将大小减小到200000,它起作用了。同样的代码再次使用C-free4编辑器(mingw2.95)没有任何问题,而大小为400000。你有什么建议让代码在VisualStudio中工作吗?可能是合并排序中的递归导致了问题。 最佳答案 问题解决了。感谢Kotti提供代码。我在与该代码进行

c++ - 如何在 C++ 中找到递归函数的深度

如何在不传递上一级的情况下在C++中找到递归函数内的当前深度?即是否可以知道函数被调用了多少次而不使用参数来跟踪级别并在每次调用函数时将该数字作为参数传递?例如我的递归函数是这样的:DoSomething(intlevel){printlevel;if(level>10)return;DoSomething(++level);}main{DoSomething(0);} 最佳答案 基于JoshD已经给出的答案:voidrecursive(){staticintcalls=0;staticintmax_calls=0;calls++;