在C++中使用递归的主要原则是什么?

mr_*_*r_T 2 c++ recursion

作为C++的新手,我想知道在使用递归时是否有特定的事情需要考虑,因为与Python,Java和/或函数语言等语言相比,语言的特异性和低级别性.

另外,我想知道各种编译器在处理递归方面是否存在很多差异(特别是关于尾递归).我目前在CodeBlocks和VS2010上使用gcc.

jus*_*tin 5

C++中的递归应该绑定,而不是非常深入 - 特别是当您的实现能够创建非常重要的堆栈分配时.如果您的程序不符合这些要求,那么您应该采用另一种方法(例如迭代).

每个函数调用都需要一些堆栈存储,而您的函数参数也需要堆栈存储.您获得多少堆栈存储取决于您的实现/环境.现代桌面系统通常不会给你超过几MB.其他实现将为您提供更少的功能.

如果您的调用超出了线程堆栈的边界,那么您将获得堆栈溢出.

有一些优化可以消除递归函数中的嵌套调用,但是你的实现不应该依赖于这种行为,因为它是不安全的(例如,在更新编译器,更改构建设置或代码库之后可能不再执行优化)进化).

  • 经验法则:`O(log N)`递归深度正常,`O(N)`不正常,`O(sqrt(N))`可能不行. (2认同)
  • @MSalters要么那么,要么'N`是一个已知的小数,可能是常数.我正在考虑回溯算法,如8皇后问题,或解决数独.递归深度显然是"O(N)",但是"N"是一个已知的相对较小的常数(对于8个皇后问题为8,对于数独为81).并且尝试在没有递归的情况下解决回溯是我不想尝试的事情. (2认同)