开发平台(Platform): (Ex: Win10, Linux, ...)
Windows
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Dev cpp
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
无
问题(Question):
递回数字很大, 会stackoverflow
喂入的资料(Input):
1-9
预期的正确结果(Expected Output):
[1] 1, 2
[2] 1, 3
[3] 1, 4
[4] 1, 5
....
[87] 9, 8
错误结果(Wrong Output):
到一定的数字就会stack overflow
我只会用-Wl,-stack,5000000000解决
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
http://codepad.org/gwTDYbwW
补充说明(Supplement):
程式没有写错
我想问怎么解决stack overflow的问题
我有想过要做到一定程度(例如数字<2000)
把结果先存起来 再去做递回
但我不知道怎么做
作者:
idiont (supertroller)
2018-07-16 12:40:00作者: jerryh001 2018-07-12 15:25:00
改成循环
作者:
Neisseria (Neisseria)
2018-07-12 15:38:00可以调 stack size 吗? Windows 默认 stack size 较小没看到叙述,不好意思...
编译带-O2试试 VC++应该有tail recursion?
作者:
cutekid (可爱小孩子)
2018-07-12 17:25:00不知道是怎样的题目呢?方便叙述一下吗^_^
你的tab宽度好多种 有2, 4, 6, 8 *_*
作者:
bluesoul (å¿™æ»ä½ è€çˆ¸)
2018-07-12 17:53:00增加stack size
作者:
moebear (萌熊)
2018-07-12 19:39:00应该只要n层吧
作者:
cutekid (可爱小孩子)
2018-07-12 21:25:00看来是要列出 c(9,n) * n! 的所有结果
作者:
cphe (魔鬼藏在垃圾筒里)
2018-07-12 21:44:00你这做法不是这题用递回的精神,n层就应该可解决才是先假设n-1已经排列好,再去排第n位~ 然后设终止条件
原PO这样写就很像广先搜索,展开到最后stack才会开始收要像cphe大讲的那样做深先递回,stack才会有借有还
作者:
oToToT (å±å©)
2018-07-14 18:10:00自己做stack模拟呢?
作者: yvb 2018-07-14 20:26:00
就如4F的说法, 原Po程式应该有tail recursion,照理说开最佳化后, 可能让 stack 不成长, 但实测仍会爆掉;但若把SNum变为全域变量,即doPerm()外宣告string SNum;在doPerm()中改为sNum = "";则-O2后执行就不会爆掉;即使改写为C, string sNum改为char sNum[20]等等, 情况相同;另解,把有关sNum算出iNum部分另拉函数,让doPerm()没sNum亦可.(使用的编译器:g++/gcc 4.6.3)也许我用的编译器无法正常处理tail recursion?
作者: AstralBrain 2018-07-14 21:44:00
用clang试了一下 想发动tail recursion要改两个地方1. string放到global, 不然destructor会有影响2. function全部宣告成static (这我不知道为什么)好像要static才会被最佳化update: g++5.4不用加static
最好的解法就是重构不要用递回明明知道stack资源可能不够 就不要冒险用这个写法 到时候还要东挤西挤的在那边空间优化 这岂不是给自己添麻烦吗
Stack overflow解法很少, 一是从gcc/linker下手,setrlimit()/--split-stack/-stack-size二就是在近一步降低function内的stack size最后也是最常见的,写成循环吧...另外老师如果给出解法 请务必让我们知道一下怎么解 XD不过脑筋急转弯一下,可以把本来该存stack的放到global的heap,global new一个能自动增长的容器(string就是)把所有东西都往里面塞