Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
pp:rec [2017/02/24 16:24]
pdmatei created
pp:rec [2019/02/17 23:42] (current)
dmihai add reading
Line 27: Line 27:
 #include <​stdlib.h>​ #include <​stdlib.h>​
 #include <​assert.h> ​ #include <​assert.h> ​
 + 
 #define NODE_NO 3 #define NODE_NO 3
 // graph represented as adjacency matrix // graph represented as adjacency matrix
Line 33: Line 33:
  int** m;  int** m;
  int nodes;  int nodes;
-} Graph; +}Graph; 
 + 
 Graph make_graph (int** m, int n){ Graph make_graph (int** m, int n){
- Graph g; + struct ​Graph= (struct Graph*)malloc(sizeof(struct Graph))
- g.m = m; + g->m = m; 
- g.nodes = n;+ g->nodes = n;
  return g;  return g;
 } }
- +  
-int visited[NODE_NO];​ +int visited[NODE_NO] ​= {0,0,0}
 + 
 void visit(Graph g, int from){ void visit(Graph g, int from){
  visited[from] = 1;  visited[from] = 1;
  printf("​ Visited %i ",​from);​  printf("​ Visited %i ",​from);​
  int i;  int i;
- for (i = 0; i<g.nodes; i++){ + for (i = 0; i<g->nodes; i++){ 
- if (g.m[from][i] && !visited[i])+ if (g->m[from][i] && !visited[i])
  visit(g,​i);​  visit(g,​i);​
  }  }
 } }
 +
 +int main (){
 +
 + int** a = (int**)malloc(NODE_NO*sizeof(int*));​
 + a[0] = (int*)malloc(NODE_NO*sizeof(int));​
 + a[0][0] = 0; a[0][1] = 1; a[0][2] = 0;
 + a[1] = (int*)malloc(NODE_NO*sizeof(int));​
 + a[1][0] = 0; a[1][1] = 0; a[1][2] = 1;
 + a[2] = (int*)malloc(NODE_NO*sizeof(int));​
 + a[2][0] = 0; a[2][1] = 0; a[2][2] = 0;
 +
 + Graph g = make_graph((int**)a,​3);​
 + visit(g,​0);​
 +
 + //​visit(g,​1);​
 +
 +}
 +
  
 </​code>​ </​code>​
Line 204: Line 222:
         if (i == n)         if (i == n)
                 return f2;                 return f2;
-        ​f1 = f2; +        ​int nf1 = f2; 
-        ​f2 = f1+f2; +        ​int nf2 = f1+f2; 
-        ​= i+1; +        ​int ni = i+1; 
-        ​= n;       //​this instruction may be later eliminated by subsequent optimisation stages.+        ​int nn = n;       //​this instruction may be later eliminated by subsequent optimisation stages. 
 +        f1 = nf1; 
 +        f2 = nf2; 
 +        i = ni; 
 +        nn = n;
         goto start;         goto start;
 } }
Line 290: Line 312:
 op (a, op (b, op (c, fold (i, op, [])))) op (a, op (b, op (c, fold (i, op, []))))
 op (a, op (b, op (c, i))) op (a, op (b, op (c, i)))
-a op (b op ( c op i))+a op (b op (c op i))
 </​code>​ </​code>​
  
Line 300: Line 322:
 tail_fold(op(b,​op(a,​i)),​op,​ [c]) tail_fold(op(b,​op(a,​i)),​op,​ [c])
 tail_fold(op(c,​op(b,​op(a,​i))),​op,​[]) tail_fold(op(c,​op(b,​op(a,​i))),​op,​[])
-((c op bop aop i +c op (b op (a op i)) 
 </​code>​ </​code>​
  
Line 349: Line 371:
 <code haskell> <code haskell>
 foldr op acc [] = acc foldr op acc [] = acc
-foldr op acc (x:xs) = op (foldr op acc xs)+foldr op acc (x:xs) = op (foldr op acc xs)
 </​code>​ </​code>​
  
Line 375: Line 397:
 <code haskell> <code haskell>
 reverse l = foldl (:) [] l reverse l = foldl (:) [] l
-append l1 l2 = foldl (:) l2 l1+append l1 l2 = foldr (:) l2 l1
 </​code>​ </​code>​
  
 +===== Recommended Reading =====
 +
 +  * [[http://​worrydream.com/​refs/​Hughes-WhyFunctionalProgrammingMatters.pdf|Why Functional Programming Matters]]
 +  * [[https://​wiki.haskell.org/​Why_Haskell_matters|Why Haskell Matters]]