From: Jason Roelofs Date: 2007-04-17T04:35:37+09:00 Subject: Re: factorial in ruby ------=_Part_46131_23142513.1176752135374 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline 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_46131_23142513.1176752135374--