funprop(f, p)

Untitled

function funprop(f,p)
{
  return function s(a,b)
  {
      if(a<=b)
      {
        let arr = [];
        let c = arr.length;

        for (let i = a; i <= b; i++) 
        {
            arr [c] = i;
            c++;
        }
        return arr;
      }
  };
}

Eredita(t)

Si consideri un albero k-ario, in cui i nodi hanno la struttura {val: n, figli: [ t1, ..., tk ]}, come visto a lezione. Si vuole distribuire l’eredità di ogni nodo intermedio ai suoi figli in questo modo: il valore n di un nodo viene distribuito in parti uguali ai figli, ciascuno dei quali riceve dunque n/k. La quota ereditata viene sommata al valore di n di ciascun erede, e se l’erede non è una foglia, il risultato viene ulteriormente diviso ai figli, e così via.

Si scriva una funzione eredita(t) che, ricevuto come argomento un albero t nel formato descritto sopra, restituisca il valore totale (n proprio più quota ereditata) del nodo foglia con valore massimo.

Esempi:

t={val: 16, figli: [{val: 4},{val: 2, figli: [{val: 8},{val: 2}]}]}

eredita(t) → 13

eredita({val: 5}) → 5

Ragionamento: t={val: 16, figli: [{val: 4},{val: 2, figli: [{val: 8},{val: 2}]}]} eredita(t) → 13

function conta_nodi(t,n)
{
  let val = 0;
  
  if(t.figli)  //nodo
  {
    let c = 0;  let y = 0;
    c = (n+t.val) / t.figli.length;
    
    for(let i in t.figli)
    {
      y = conta_nodi(t.figli[i], c);
      
      if(i=0)
        val = y
      else if (y>val)
        val = y;        
    }
  }
  else    //nodo foglia
  {
    val = n + t.val;
    
    if(n > val)
      val = n;
  }
  return val;
}

function eredita(t)
{
  //se la radice ha figli
  if(t.figli)    
  {
    let c = 0;
    let max = 0;
    let n = t.val / t.figli.length;
    
    for(let i in t.figli)
    {
      c = conta_nodi(t.figli[i], n);
      
      if(c > max)
      {
        max = c;
      }
    }
    
    return max;
  }
  else  //altrimenti restituisce val
  {
    return t.val;
  }
}