limitless and recursion-free recursion limits!

40
Limitless and recursion-free recursion limits!

Upload: akaptur

Post on 13-Apr-2017

481 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Limitless and recursion-free recursion limits!

Limitless and recursion-free

recursion limits!

Page 2: Limitless and recursion-free recursion limits!

>>> def factorial(n):... if n == 1:... return 1... else:... return n * factorial(n - 1)

Page 3: Limitless and recursion-free recursion limits!

>>> factorial(10)3628800

Page 4: Limitless and recursion-free recursion limits!

>>> factorial(500)1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

Page 5: Limitless and recursion-free recursion limits!

>>> factorial(999)402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

Page 6: Limitless and recursion-free recursion limits!

>>> factorial(1000)

Page 7: Limitless and recursion-free recursion limits!

File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorialRuntimeError: maximum recursion depth exceeded

Page 8: Limitless and recursion-free recursion limits!

:(

Page 9: Limitless and recursion-free recursion limits!

Recursion limit

Page 10: Limitless and recursion-free recursion limits!

>>> import sys>>> sys.setrecursionlimit(10**8)

Page 11: Limitless and recursion-free recursion limits!

>>> factorial(1000)402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

Page 12: Limitless and recursion-free recursion limits!

>>> factorial(1000000)

Page 13: Limitless and recursion-free recursion limits!

>>> factorial(1000000)Segmentation fault: 11

Page 14: Limitless and recursion-free recursion limits!

:( :( :(

Page 15: Limitless and recursion-free recursion limits!

:D

Page 16: Limitless and recursion-free recursion limits!
Page 17: Limitless and recursion-free recursion limits!

:D

Page 18: Limitless and recursion-free recursion limits!

>>> def factorial(n):... if n == 1:... return 1... else:... return n * factorial(n - 1)

Page 19: Limitless and recursion-free recursion limits!

if (tstate->recursion_depth > recursion_limit) { --tstate->recursion_depth; PyErr_Format(PyExc_RuntimeError, "maximum recursion depth exceeded%s", where); return -1; }

Page 20: Limitless and recursion-free recursion limits!

...c -------------a | factorial |l -------------l | factorial | -------------s | factorial |t -------------a | factorial |c -------------k | REPL | <-- this one counts! -------------

Page 21: Limitless and recursion-free recursion limits!

:D

Page 22: Limitless and recursion-free recursion limits!

Tail Call Optimization

Page 23: Limitless and recursion-free recursion limits!

c -------------a | factorial | (1) >>> def factorial(n):l ------------- ... if n == 1:l | factorial | (2) ... return 1 ------------- ... else:s | factorial | (3) ... return n * factorial(n - 1)t -------------a | factorial | (4)c -------------k | factorial | (5) ------------- | REPL | -------------

Page 24: Limitless and recursion-free recursion limits!

def factorial(n, accumulator): if n <= 1: return accumulator else: return factorial(n-1, accumulator * n)

Page 25: Limitless and recursion-free recursion limits!

>>> factorial(1000)

Page 26: Limitless and recursion-free recursion limits!

File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorial File "<stdin>", line 5, in factorialRuntimeError: maximum recursion depth exceeded

Page 27: Limitless and recursion-free recursion limits!

OR DOES IT.with Liuda Nikolaeva and Paul Tagliamonte

Page 28: Limitless and recursion-free recursion limits!

def fact(n, accumulator): 10 if n <= 1: return accumulator else: n = n - 1; accumulator = accumulator * n GOTO 10 # return fact(n-1, accum*n)

Page 29: Limitless and recursion-free recursion limits!

or is there

Page 30: Limitless and recursion-free recursion limits!

>>> import dis>>> dis.dis(factorial) 2 0 LOAD_FAST 0 (n) 3 LOAD_CONST 1 (1) 6 COMPARE_OP 1 (<=) 9 POP_JUMP_IF_FALSE 16

3 12 LOAD_FAST 1 (accumulator) 15 RETURN_VALUE

5 >> 16 LOAD_GLOBAL 0 (factorial) 19 LOAD_FAST 0 (n) 22 LOAD_CONST 1 (1) 25 BINARY_SUBTRACT 26 LOAD_FAST 1 (accumulator) 29 LOAD_FAST 0 (n) 32 BINARY_MULTIPLY 33 CALL_FUNCTION 2 36 RETURN_VALUE 37 LOAD_CONST 0 (None) 40 RETURN_VALUE

Page 31: Limitless and recursion-free recursion limits!

>>> import dis>>> dis.dis(factorial) 2 0 LOAD_FAST 0 (n) 3 LOAD_CONST 1 (1) 6 COMPARE_OP 1 (<=) 9 POP_JUMP_IF_FALSE 16

3 12 LOAD_FAST 1 (accumulator) 15 RETURN_VALUE

5 >> 16 NOP 19 LOAD_FAST 0 (n) 22 LOAD_CONST 1 (1) 25 BINARY_SUBTRACT 26 LOAD_FAST 1 (accumulator) 29 LOAD_FAST 0 (n) 32 BINARY_MULTIPLY 33 JUMP_ABSOLUTE 0 36 RETURN_VALUE 37 LOAD_CONST 0 (None) 40 RETURN_VALUE

Page 32: Limitless and recursion-free recursion limits!

>>> def hi():... print("hi!")...>>> def nope():... print("haha, nope!")...>>> hi.__code__ = nope.__code__>>> hi()haha, nope!

Page 33: Limitless and recursion-free recursion limits!

def tail_recurse(fn): new_bytecode = [] code_obj = fn.__code__ for byte, arg in consume(code_obj.co_code): name = opcode.opname[byte]

if name == "LOAD_GLOBAL" and code_obj.co_names[arg] == fn.__name__: pass elif name == "CALL_FUNCTION": for i in range(arg): new_bytecode.append(opmap["STORE_FAST"]) new_bytecode += split(arg - i - 1) new_bytecode.append(opmap["JUMP_ABSOLUTE"]) new_bytecode += split(0) # jump to beginning of bytecode else: new_bytecode.append(byte) if arg is not None: new_bytecode += split(arg)

return "".join([chr(b) for b in new_bytecode])

Page 34: Limitless and recursion-free recursion limits!

$ python factorial_tco.py 1000

402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L

Page 35: Limitless and recursion-free recursion limits!

$ python factorial_tco.py 1000000 # ONE MILLION

Page 36: Limitless and recursion-free recursion limits!

:D

Page 37: Limitless and recursion-free recursion limits!

>>> sys.setrecursionlimit(1)Traceback (most recent call last): File "<stdin>", line 1, in <module>RuntimeError>>> sys.setrecursionlimit(5)

RuntimeError>>> sys.setrecursionlimit(10)

RuntimeError>>> sys.setrecursionlimit(100)

RuntimeError

Page 38: Limitless and recursion-free recursion limits!

>>> sys.setrecursionlimit(1)Traceback (most recent call last): File "<stdin>", line 1, in <module>RuntimeError>>> sys.setrecursionlimit(5)

RuntimeError>>> sys.setrecursionlimit(10)

RuntimeError>>> sys.setrecursionlimit(100)

RuntimeError>>> a = 1

RuntimeError>>> 7

RuntimeError

Page 39: Limitless and recursion-free recursion limits!

>>> ^DException RuntimeError: 'maximum recursion depth exceeded' in <function _remove at 0x103b9e6e0> ignoredException RuntimeError: 'maximum recursion depth exceeded' in <function _remove at 0x103ba25f0> ignored

Page 40: Limitless and recursion-free recursion limits!

!! :D