codez Posted September 8, 2016 Report 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
codez Posted September 9, 2016 Report 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
spainis Posted September 9, 2016 Report Posted September 9, 2016 function f(s) { return s.split('').filter((e, i, a) => e !== a[i-1]).join('') } Quote
codez Posted September 9, 2016 Report 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
codez Posted September 9, 2016 Report 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
spainis Posted September 9, 2016 Report Posted September 9, 2016 function f(s) { return [...s].filter((e, i, a) => e !== a[i-1]).join('') } Quote
codez Posted September 9, 2016 Report 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
spainis Posted September 9, 2016 Report 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
Леший Posted September 9, 2016 Report 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
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.