From: Tyler Prete Date: 2007-04-17T05:36:53+09:00 Subject: Re: factorial in ruby ------=_Part_19006_8040958.1176755811091 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline The inject version should work for any value, as it is iterative. The recursive version probably breaks somewhere in the thousands (on my machine just under 2000), but could be machine dependent. --Tyler Prete On 4/16/07, Jason Roelofs wrote: > > On 4/16/07, James Edward Gray II wrote: > > > > On Apr 16, 2007, at 1:58 PM, David Simas wrote: > > > > > On Tue, Apr 17, 2007 at 02:56:16AM +0900, Jason Roelofs wrote: > > >> No and most likely not. > > >> > > >> def fact(n) > > >> if n == 0 > > >> 1 > > >> else > > >> n * fact(n-1) > > >> end > > >> end > > > > > > For large enough n, this will overflow the stack. Since Ruby doesn't > > > optimize tail-recursive functions (and the above isn't tail recursive, > > > anyway), you'd better write this function as a loop (left as an > > > exercise). > > > > >> class Integer > > >> def fact > > >> (2..self).inject(1) { |f, n| f * n } > > >> end > > >> end > > => nil > > >> 0.fact > > => 1 > > >> 1.fact > > => 1 > > >> 10.fact > > => 3628800 > > >> 10_000.fact > > => 28462596809170545189064132121198688901480514017... > > > > James Edward Gray II > > > > > I knew there was a way to use #inject here, I just didn't know how. I need > to use that function more. When does this version break Ruby? > > Jason > ------=_Part_19006_8040958.1176755811091--