From: Yusuke Endoh Date: 2012-02-13T23:38:31+09:00 Subject: [ruby-core:42545] [ruby-trunk - Feature #1218][Rejected] New method needed to set and get the current recursion limit Issue #1218 has been updated by Yusuke Endoh. Status changed from Assigned to Rejected I'm rejecting this feature ticket because no progress has been made for a long time. See [ruby-core:42391]. I think it is impossible to implement recursion_limit exactly because we cannot know how much stack each C function consumes. I expected Python's recursion_limit to fail conservatively (i.e., it will raise an exception for big limit even when it is actually possible). But it was worse than I expected. Python caused SEGV when big limit is specified: import sys sys.setrecursionlimit(1000000) def foo(): foo() foo() #=> SEGV I think that this is not a correct way, at least, in Ruby. -- Yusuke Endoh ---------------------------------------- Feature #1218: New method needed to set and get the current recursion limit https://bugs.ruby-lang.org/issues/1218 Author: Conrad Taylor Status: Rejected Priority: Normal Assignee: Koichi Sasada Category: YARV Target version: 2.0.0 =begin Hi, I would like to propose the addition of two methods for setting and getting the recursion limit: recursion_limit(limit) recursion_limit => returns an Integer value At this time, I have been experimenting with recursion to compute the nth fibonacci number using ruby 1.9.1 ( i.e ruby 1.9.1p0 (2009-01-30 revision 21907) ). These tests are being ran on a Apple PowerMac G5 2.5 Ghz Quad 4 GB RAM and a MacBook Pro 2.8 GHz Intel Core 2 Duo 4 GB RAM. Also, I was able to successfully produce a result using an iteration which I'm attaching to verify the correctness of the other two algorithms: action: ./fibonacci-recursive.rb 10000 result: ./fibonacci-recursive.rb:10:in `fibonacci': stack level too deep (SystemStackError) from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:10:in `fibonacci' ... 8174 levels... from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:10:in `fibonacci' from ./fibonacci-recursive.rb:18:in `
' action: ./fibonacci-tail-recursive.rb 10000 result: ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper': stack level too deep (SystemStackError) from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' ... 7265 levels... from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' from ./fibonacci-tail-recursive.rb:10:in `fibonacci_helper' from ./fibonacci-tail-recursive.rb:17:in `fibonacci' from ./fibonacci-tail-recursive.rb:24:in `
' action: ./fibonacci-iterative.rb 10000 result: 33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812 20656491403275108664339451751216152654536133311131404243685480510676584349352383695965342807176877532834823434555736671973139274627362910821067928078471803532913117677892465908993863545932789452377767440619224033763867400402133034329749690202832814593341882681768389307200363479562311710310129195316979460763273758925353077255237594378843450406771555577905645044301664011946258097221672975861502696844314695203461493229110597067624326851599283470989128470674086200858713501626031207190317208609408129832158107728207635318662461127824553720853236530577595643007251774431505153960090516860322034916322264088524885243315805153484962243484829938090507048348244932745373262456775587908918719080366205800959474315005240253270974699531877072437682590741993963226598414749819360928522394503970716544315642132815768890805878318340491743455627052022356484649519611246026831397097506938264870661326450766507461151267752274862159864253071129844118262266105716351506926002986170494542504749137811515413 9941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875 =end -- http://bugs.ruby-lang.org/