codez Posted September 8, 2016 Report Share Posted September 8, 2016 Tu teici, ka Skala nav funkcionāla valoda (vai arī tu nepareizi lieto vārdu "pseido"). Piekrītu, ka Skala nav tīri funkcionāla, jo tajā ir arī iespējas, kas neatbilst funkcionālas programmēšanas paradigmai, bet skala nav pseido-funkcionāla, skala ir funkcionāla programmēšanas valoda, jo Skalā ir viss nepieciešamais funkcionālajai programmēšanai. Vienkārši paralēli tam Skala ir arī imperatīva un objektu orientēta programmēšanas valoda. Quote Link to comment Share on other sites More sharing options...
codez Posted September 9, 2016 Report Share Posted September 9, 2016 Wuu, piedāvāju tev parādīt FP klasi un uzrakstīt javascriptā šo vienkāršo algoritmu funkcionālā stilā: Dota simbolu virkne, atgriezt virkni, kurā izdzēsti visi dublikāti: Piemērs. aaabccddaaa -> abcda https://jsfiddle.net/dfuLay3h/1/ function f(s) { let r = "", prev = "" for(let c of s) { if (prev != c) r += c prev = c } return r } Šis protams vēl ir salīdzinoši vienkāršs piemērs, jo vienlaicīgi ir vajadzīgs piekļūt tikai diviem elementiem. Quote Link to comment Share on other sites More sharing options...
spainis Posted September 9, 2016 Report Share Posted September 9, 2016 function f(s) { return s.split('').filter((e, i, a) => e !== a[i-1]).join('') } Quote Link to comment Share on other sites More sharing options...
codez Posted September 9, 2016 Report Share Posted September 9, 2016 Ok, tas bija viegls, bet tik un tā, nākas izveidot starp masīvu, kas funkcionālo algoritmu padara 4x lēnāku:https://jsfiddle.net/dfuLay3h/3/ Quote Link to comment Share on other sites More sharing options...
codez Posted September 9, 2016 Report Share Posted September 9, 2016 function f(s) { return s.split('').filter((e, i, a) => e !== a[i-1]).join('') } Nestrādā ar visiem utf8 simboliem: https://jsfiddle.net/dfuLay3h/4/ Quote Link to comment Share on other sites More sharing options...
spainis Posted September 9, 2016 Report Share Posted September 9, 2016 function f(s) { return [...s].filter((e, i, a) => e !== a[i-1]).join('') } Quote Link to comment Share on other sites More sharing options...
codez Posted September 9, 2016 Report Share Posted September 9, 2016 Tagad nedaudz sarežģītāks uzdevums: Izveidot funkciju ar parametru n, kura izvada masīvu ar pirmskaitļiem līdz n un strādā jēdzīgā laikā (teiksim 3 sekundēs), ja n = 1'000'000 Imperatīvais risinājums ( ar n=1'000'000, man iet 142 ms ): https://jsfiddle.net/1rh9vqee/ function f(n) { let r = [] for(let i=2; i<n; i++) { let ok = 1 for(let j=0; r[j]*r[j]<=i; j++) { if (i%r[j]==0) { ok = 0 break; } } if (ok) r.push(i) } return r } Quote Link to comment Share on other sites More sharing options...
spainis Posted September 9, 2016 Report Share Posted September 9, 2016 'use strict'; function is_prime(numb, i, r) { return numb % r === 0 ? false : (r * r > numb ? true : is_prime(numb, i + 1, r)); } function p(max, numb, r) { return numb > max ? r : p(max, numb + 1, is_prime(numb, 0, r) ? r.concat([numb]) : r); } function prime(n) { return p(n, 3, [2]); } console.time('t1'); prime(1000000); console.timeEnd('t1'); function f(n) { let r = []; for(let i=2; i<n; i++) { let ok = 1; for(let j=0; r[j]*r[j]<=i; j++) { if (i%r[j]==0) { ok = 0; break; } } if (ok) r.push(i); } return r; } console.time("t2"); f(1000000); console.timeEnd("t2"); $ node --version v6.3.1 $ node --harmony_tailcalls funcs.js t1: 5253.267ms t2: 125.872ms Quote Link to comment Share on other sites More sharing options...
Леший Posted September 9, 2016 Report Share Posted September 9, 2016 @spainis, un ja return numb > max ? r : p(max, numb + 1, is_prime(numb, 0, r) ? r.concat([numb]) : r); samainīt uz return numb > max ? r : p(max, numb + 2, is_prime(numb, 1, r) ? r.concat([numb]) : r); ? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.