Time microsecondsToRun: [ |n| n := (2 raisedToInteger: 8 * 8) - 1. Transcript nextPutAll: 'The number of grains on an 8x8 chessboard is '; print: n; cr; endEntry]. <PRINT-IT> On my laptop, this reports 194 microseconds.
Why would you use recursion, anyway? Time microsecondsToRun: [ |n| n := (1 to: 8 * 8) inject: 0 into: [:acc :each | acc+acc+1]. Transcript nextPutAll: 'The number of grains on an 8x8 chessboard is '; print: n; cr; endEntry]. <PRINT-IT> On the same laptop, this reports 118 microseconds. One of the lessons of 'functional' languages, promptly adopted by Smalltalk, is to encapsulate control structures into reusable methods, such as #inject:into:, more commonly known as `foldl` in functional languages. It's then none of my business whether such a method works by recursion, iteration, or gangs of otherwise seasonally unemployed Christmas elves. In my own Smalltalk library, (GeometricSeries new: 64 from: 1 byFactor: 2) sum only takes 15 microseconds. I do note that you are calling validateInput repeatedly. Why? On Sun, 5 Jan 2020 at 07:41, Roelof Wobben via Pharo-users <pharo-users@lists.pharo.org> wrote: > > Oke, > > So I can better not use recursion for this problem if I understand you well, > Richard. > > Roelof > > > > Op 4-1-2020 om 19:02 schreef Richard Sargent: > > On Sat, Jan 4, 2020 at 9:47 AM Roelof Wobben via Pharo-users > <pharo-users@lists.pharo.org> wrote: >> >> Hello, >> >> For a exercism challenge I need to calculate the total grains on a >> chessboard. >> So I did : >> >> atSquare: anInteger >> self validateInput: anInteger. >> ^ anInteger = 1 >> ifTrue: [ 1 ] >> ifFalse: [ 2 * (self atSquare: anInteger - 1) ] >> >> >> but when I run the tests , the vm seems to be not responsive for some 4 >> - 5 seconds. >> >> Is there a way I can use this code and take care that the vm stays >> responsive. > > > What do you want the VM to do in addition to calculating that sum while it is > calculating that sum? > > > The best way to keep the VM responsive is to take a page from Gauss' notebook > and pay attention to the numbers[1]. Let's consider the first four squares > and extrapolate from there. > > In binary, the squares hold the following grains: 2r1, 2r10, r2100, and > 2r1000. When we add them up, we get 2r1111. If we use Gauss' tricks, we can > notice that 2r1111 is equal to 2r10000 - 1. So, the sum of the grains on the > first 4 squares is 2^5 - 1. You can easily generalize that pattern, of > course. Then your program can calculate the answer quickly. > > > [1] The story goes that Gauss' teacher was frustrated with his student's > abilities and set him a challenge to occupy him for some time: sum the > numbers from 1 through 100. Gauss immediately answered 5,050, much to his > teacher's chagrin. > >> >> Regards, >> >> Roelof >> >> >