Skip to content

Commit fbb8f35

Browse files
committed
modified recursion tree
1 parent b3a4d73 commit fbb8f35

8 files changed

Lines changed: 247 additions & 36 deletions

File tree

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ So far there are 6 segments
2020
- Recursion Tree
2121
- Turing Machine
2222

23-
I have implemented a total of `17 algorithms` so far. And will try to add more later.
23+
I have implemented a total of `22 algorithms` so far. And will try to add more later.
2424

2525
## Algorithms implemented
2626

@@ -39,7 +39,11 @@ I have implemented a total of `17 algorithms` so far. And will try to add more l
3939
- Graham Scan for Convex Hull
4040
- Binary Search
4141
- Recursion
42-
- Fibonacci
42+
- Fibonacci Number
43+
- Binomial Coeficient
44+
- Derangement
45+
- Fast Exponentiation
46+
- Stirling Number of Second Kind
4347

4448
- Turing Machine
4549
- Bitwise NOT

src/Graph/Tree.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33

44
export class Tree{
5-
constructor(node=0,children=[]) {
5+
constructor(node=0,children=[],label="") {
66
this.id = 0;
77
this.node = node;
8+
this.label = label;
89
this.width = node.length;
910
this.children = children;
1011
}

src/Graph/canvasSVG.jsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,19 @@ class CanvasSvg extends Component {
2222

2323
render() {
2424
console.log(this.props.vertices.length);
25+
let off = this.props.offset;
2526
return (
2627
<div>
27-
<svg viewBox="0 0 240 80" xmlns="http://www.w3.org/2000/svg">
28+
<svg viewBox="0 0 240 200" xmlns="http://www.w3.org/2000/svg">
2829
{
2930
this.props.edges.map((edge, cellidx) => {
3031
return (
3132
<Edge
3233
// key={vertex.id}
33-
// id={cell.id+50}
34+
id={cellidx}
3435

35-
pos={ {x1:edge.x1*10+50,y1:edge.y1*10+10,
36-
x2:edge.x2*10+50,y2:edge.y2*10+10} }
36+
pos={ {x1:(edge.x1-off)*15+120,y1:edge.y1*15+10,
37+
x2:(edge.x2-off)*15+120,y2:edge.y2*15+10} }
3738
/>
3839
);
3940
})}
@@ -43,10 +44,12 @@ class CanvasSvg extends Component {
4344
return (
4445
<Vertex
4546
// key={vertex.id}
46-
// id={cell.id+50}
47+
id={cellidx}
4748
current={this.props.current === cellidx}
48-
label={vertex.val}
49-
pos={ {x:vertex.x*10+50,y:vertex.y*10+10} }
49+
label={vertex.label}
50+
ret={vertex.val}
51+
pos={ {x:(vertex.x-off)*15+120,y:vertex.y*15+10,
52+
px:(vertex.px-off)*15+120,py:vertex.py*15+10} }
5053
/>
5154
);
5255
})}

src/Graph/edge.jsx

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,91 @@
11
import React, {Component} from 'react';
22

33
class Edge extends Component {
4+
constructor() {
5+
super();
6+
this.state={
7+
x1:0
8+
}
9+
}
10+
componentDidMount() {
11+
this.setState({x1:this.props.pos.x1});
12+
document.getElementById('vbanim1'+this.props.id).beginElement();
13+
document.getElementById('vbanim2'+this.props.id).beginElement();
14+
}
15+
16+
componentDidUpdate(prevProps) {
17+
if (this.state.x1 !== this.props.pos.x1) {
18+
this.setState({x1:this.props.pos.x1});
19+
document.getElementById('vbanim1'+this.props.id).beginElement();
20+
document.getElementById('vbanim2'+this.props.id).beginElement();
21+
}
22+
}
23+
getPolyPoints = ()=>{
24+
let x1 = this.props.pos.x1;
25+
let y1 = this.props.pos.y1;
26+
let x2 = this.props.pos.x2;
27+
let y2 = this.props.pos.y2;
28+
let l = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
29+
let r = 6.5;
30+
let xx1 = ( x1*(l-r)+x2*r )/l;
31+
let yy1 = ( y1*(l-r)+y2*r )/l;
32+
return xx1+","+yy1+" "+x2+","+y2;
33+
}
34+
getPolyPointsX = ()=>{
35+
let x1 = this.props.pos.x1;
36+
let y1 = this.props.pos.y1;
37+
let x2 = this.props.pos.x2;
38+
let y2 = this.props.pos.y2;
39+
let l = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
40+
let r = 6.5;
41+
let xx1 = ( x2*(l-r)+x1*r )/l;
42+
let yy1 = ( y2*(l-r)+y1*r )/l;
43+
return xx1;
44+
// return xx1+","+yy1+" "+x2+","+y2;
45+
}
46+
getPolyPointsY = ()=>{
47+
let x1 = this.props.pos.x1;
48+
let y1 = this.props.pos.y1;
49+
let x2 = this.props.pos.x2;
50+
let y2 = this.props.pos.y2;
51+
let l = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
52+
let r = 6.5;
53+
let xx1 = ( x2*(l-r)+x1*r )/l;
54+
let yy1 = ( y2*(l-r)+y1*r )/l;
55+
return yy1;
56+
// return xx1+","+yy1+" "+x2+","+y2;
57+
}
458
render() {
559
return (
660
<g>
7-
<line x1={this.props.pos.x1} y1={this.props.pos.y1} x2={this.props.pos.x2} y2={this.props.pos.y2}
8-
// style={{"stroke:rgb(255,0,0);stroke-width:2"}}/>
9-
style={{stroke:'rgb(255,0,0)', strokeWidth:'0.5'}}/>
61+
<defs>
62+
<marker id="arrow" viewBox="0 0 10 10" refX="5" refY="5"
63+
markerWidth="4" markerHeight="4"
64+
orient="auto-start-reverse">
65+
<path d="M 0 0 L 10 5 L 0 10 z" />
66+
</marker>
67+
</defs>
68+
<line x2={this.getPolyPointsX()} y2={this.getPolyPointsY()} x1={this.props.pos.x1} y1={this.props.pos.y1}
69+
style={{stroke:'black', strokeWidth:'0.5'}}
70+
marker-end="url(#arrow)"
71+
>
72+
<animate
73+
id={'vbanim1'+this.props.id}
74+
attributeName='x2'
75+
values={this.props.pos.x1+';'+this.getPolyPointsX()}
76+
dur='0.5s'
77+
repeatCount="1"
78+
/>
79+
<animate
80+
id={'vbanim2'+this.props.id}
81+
attributeName='y2'
82+
values={this.props.pos.y1+';'+this.getPolyPointsY()}
83+
dur='0.5s'
84+
repeatCount="1"
85+
/>
86+
</line>
87+
{/*<polyline points={this.getPolyPoints()} fill="none" stroke="black" strokeWidth={'0.5'}*/}
88+
{/* marker-start="url(#arrow)" />*/}
1089
</g>
1190
);
1291
}

src/Graph/fib.jsx

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import {Tree,buchheim} from './Tree';
2-
export function getTree(n,algo=0){
2+
export function getTree(n,algo=0,r=0){
33
if(algo === 0)
44
return buchheim( fib(n) );
55
else if( algo === 1 )
6-
return buchheim(sib(n));
6+
return buchheim(NcR(n,r));
7+
else if( algo === 2 )
8+
return buchheim(derangement(n));
9+
else if( algo === 3 )
10+
return buchheim(bigmod(n,r));
11+
else if( algo === 4 )
12+
return buchheim(stirling2(n,r));
713
}
814

915
function fib(n){
10-
let tree = new Tree(n,[]);
16+
let tree = new Tree(n,[],n+"");
1117
if( n <2 ) return tree;
1218
tree.children.push( fib(n-1) );
1319
tree.children.push( fib(n-2) );
@@ -22,4 +28,61 @@ function sib(n){
2228
tree.children.push( sib(n-3) );
2329
tree.node = tree.children[0].node+tree.children[1].node;
2430
return tree;
31+
}
32+
33+
function NcR(n,r){
34+
if (r > n)
35+
return new Tree(-1,[],"("+n+","+r+")");
36+
37+
if (n === r)
38+
return new Tree(1,[],"("+n+","+r+")");
39+
40+
if (r === 0)
41+
return new Tree(1,[],"("+n+","+r+")");;
42+
43+
// nCr(n, r) = nCr(n - 1, r - 1) + nCr(n - 1, r)
44+
let tree = new Tree(0,[],"("+n+","+r+")");
45+
tree.children.push( NcR(n-1,r-1) );
46+
tree.children.push( NcR(n-1,r) );
47+
tree.node = tree.children[0].node+tree.children[1].node;
48+
return tree;
49+
}
50+
51+
function derangement(n){
52+
if( n == 0 ) return new Tree(1,[],n+"");
53+
if( n == 1 ) return new Tree(0,[],n+"");
54+
let tree = new Tree(0,[],n+"");
55+
tree.children.push( derangement(n-1) );
56+
tree.children.push( derangement(n-2) );
57+
tree.node = (n-1)*(tree.children[0].node+tree.children[1].node);
58+
return tree;
59+
}
60+
61+
function bigmod(n,r){
62+
if( r === 0 ) return new Tree(1,[],"("+n+","+r+")");
63+
if( r === 1 ) return new Tree(n,[],"("+n+","+r+")");
64+
let tree = new Tree(1,[],"("+n+","+r+")");
65+
if( r%2 === 1 ){
66+
tree.children.push( bigmod(n,(r-1)/2 ) );
67+
tree.children.push( bigmod(n,(r-1)/2) );
68+
tree.children.push( bigmod(n,1) );
69+
}else{
70+
tree.children.push( bigmod(n,r/2 ) );
71+
tree.children.push( bigmod(n,r/2) );
72+
}
73+
for(let i=0;i<tree.children.length;i++){
74+
tree.node *= tree.children[i].node;
75+
}
76+
return tree;
77+
}
78+
79+
function stirling2(n,r){
80+
if( n === r ) return new Tree(1,[],"("+n+","+r+")");
81+
if( r === 0 ) return new Tree(0,[],"("+n+","+r+")");
82+
83+
let tree = new Tree(0,[],"("+n+","+r+")");
84+
tree.children.push( stirling2(n-1,r) );
85+
tree.children.push( stirling2(n-1,r-1) );
86+
tree.node = tree.children[0].node*r+tree.children[1].node;
87+
return tree;
2588
}

src/Graph/graph.jsx

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ class Graph extends Component {
1313
edges:[],
1414
current:-1,
1515
n:0,
16-
algo:0
16+
r:2,
17+
algo:0,
18+
offset:0
1719
}
1820
}
1921
// setNumber = (event)=>{
@@ -35,10 +37,16 @@ class Graph extends Component {
3537
this.setState({n: val});
3638
}
3739
}
40+
setR = (pos, val) => {
41+
if (pos === 0) {
42+
// console.log("sup 0");
43+
this.setState({r: val});
44+
}
45+
}
3846
addNumber = ()=>{
3947
// console.log(getFibTree(3));
40-
let tree = getTree(this.state.n,this.state.algo);
41-
this.setState({edges:[],vertices:[]});
48+
let tree = getTree(this.state.n,this.state.algo,this.state.r);
49+
this.setState({edges:[],vertices:[],offset:tree.x});
4250
this.state.vertices = [];
4351
// this.setState({});
4452
this.recur(tree,undefined);
@@ -49,12 +57,16 @@ class Graph extends Component {
4957
let vertices = this.state.vertices;
5058
let current = this.state.vertices.length;
5159

52-
if( node.children.length )
53-
vertices.push({val:0,x:node.x,y:node.y});
54-
else
55-
vertices.push({val:node.tree.node,x:node.x,y:node.y});
56-
this.setState({vertices,current});
60+
5761
if( parent!==undefined ){
62+
if( node.children.length )
63+
vertices.push({label:node.tree.label,val:0,x:node.x,y:node.y,px:parent.x,py:parent.y});
64+
else
65+
vertices.push({label:node.tree.label,val:node.tree.node,x:node.x,y:node.y,px:parent.x,py:parent.y});
66+
this.setState({vertices,current});
67+
68+
69+
5870
let edges = this.state.edges;
5971
edges.push({
6072
x1:parent.x,
@@ -63,31 +75,42 @@ class Graph extends Component {
6375
y2:node.y
6476
});
6577
this.setState({edges});
78+
}else{
79+
if( node.children.length )
80+
vertices.push({label:node.tree.label,val:0,x:node.x,y:node.y,px:node.x,py:node.y});
81+
else
82+
vertices.push({label:node.tree.label,val:node.tree.node,x:node.x,y:node.y,px:node.x,py:node.y});
83+
this.setState({vertices,current});
6684
}
6785
await sleep(500);
6886

6987

7088
for(let i=0;i<node.children.length;i++){
7189
await this.recur( node.children[i],node );
72-
let verticess = [...this.state.vertices];
73-
verticess[current].val+=node.children[i].tree.node;
74-
this.setState({current,vertices:verticess});
90+
// let verticess = [...this.state.vertices];
91+
// verticess[current].val+=node.children[i].tree.node;
92+
this.setState({current});
7593
await sleep(500);
7694
}
95+
let verticess = [...this.state.vertices];
96+
verticess[current].val=node.tree.node;
97+
this.setState({vertices:verticess});
7798
}
7899
render() {
79100
return (
80101
<div>
81102
<Navbar/>
82103
<Menu
83104
setN={this.setN}
105+
setR={this.setR}
84106
setAlgo={this.setAlgo}
85107
onStart={this.addNumber}
86108
/>
87109
<CanvasSvg
88110
vertices={this.state.vertices}
89111
edges={this.state.edges}
90112
current={this.state.current}
113+
offset={this.state.offset}
91114
/>
92115
</div>
93116
);

src/Graph/menu.jsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,21 @@ class Menu extends Component {
2020
<SimpleSelect
2121
pos={0}
2222
label={'Task'}
23-
items={['Fibonacci','Sibonacci']}
23+
items={['Fibonacci','Binomial Coefficient',"Derangement","Bigmod","Stirling2"]}
2424
onValueChanged={this.props.setAlgo}
2525
/>
2626
<SimpleSelect
2727
pos={0}
2828
label={'N'}
29-
items={[1,2,3,4,5,6,7]}
29+
items={[0,1,2,3,4,5,6]}
3030
onValueChanged={this.props.setN}
3131
/>
32+
<SimpleSelect
33+
pos={0}
34+
label={'R'}
35+
items={[0,1,2,3,4,5,6]}
36+
onValueChanged={this.props.setR}
37+
/>
3238
<button
3339
className='btn btn-warning btn-lg m-2'
3440
onClick={this.props.onReset}

0 commit comments

Comments
 (0)