Jump to content
php.lv forumi

bilžu pievienošana lietotājam


Llama

Recommended Posts

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.

Link to comment
Share on other sites

  • Replies 38
  • Created
  • Last Reply

Top Posters In This Topic

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.

Link to comment
Share on other sites

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
}
Link to comment
Share on other sites


'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

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...