Fibonacci
Examples for Fibonacci Sequence.
Recursive
occult
fn fib_recursion(i64 n) i64 {
if n == 0 {
return n;
}
else if n == 1 {
return n;
}
else {
return fib_recursion(n - 1) + fib_recursion(n - 2);
}
}
fn main() i64 {
i64 n = fib_recursion(40);
print_integer(n);
print_string("\n");
return 0;
}
While Loop
occult
fn fib_while(i64 n) i64 {
i64 n1 = 0;
i64 n2 = 1;
i64 i = 0;
while i < n {
i64 next = n1 + n2;
n1 = n2;
n2 = next;
i = i + 1;
}
return n1;
}
fn main() i64 {
i64 n = fib_while(40);
print_integer(n);
print_string("\n");
return 0;
}
Factorial
Example for factorial in Occult.
occult
fn factorial(i64 n) i64 {
if n == 0 || n == 1 {
return 1;
}
return n * factorial(n - 1);
}
fn main() i64 {
i64 n = factorial(5);
print_integer(n);
print_string("\n");
return 0;
}
Sum
Using Pointers
Using pointers to sum an array of values {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
occult
fn sum_arr(i64* p, i64 size) i64 {
i64 sum = 0;
for i64 i = 0 when i < size do i = i + 1 {
sum = sum + $(p + (i * 8));
}
return sum;
}
fn main() i64 {
i64* arr = alloc(80);
for i64 i = 0 when i < 10 do i = i + 1 {
$(arr + (i * 8)) = i;
}
print_integer(sum_arr(arr, 10)); // 45
print_string("\n");
del(arr);
return 0;
}
Using Arrays
Same thing using arrays.
Arrays aren't supported in function arguments, this will likely change in the near future.
occult
fn main() i64 {
array[10] i64 arr;
for i64 i = 0 when i < 10 do i = i + 1 {
arr[i] = i;
}
i64 sum = 0;
for i64 j = 0 when j < 10 do j = j + 1 { // Using j because scope isn't implemented yet.
sum = sum + arr[j];
}
print_integer(sum);
print_string("\n");
return 0;
}
Linked List
Example of a linked list in Occult.
occult
struct node {
i64 val;
node* next;
}
fn alloc_node(i64 val) node* {
node* n = alloc(16);
n.val = val;
n.next = 0;
return n;
}
fn alloc_next_node(node* prev_node, i64 val) node* {
node* new_node = alloc_node(val);
node* current = prev_node;
while current.next != 0 {
current = current.next;
}
current.next = new_node;
return new_node;
}
fn free_list(node* head) i64 {
node* current = head;
while current != 0 {
node* next_node = current.next;
del(current);
current = next_node;
}
return 0;
}
fn print_all_elems(node* head) i64 {
node* current = head;
while current != 0 {
print_integer(current.val);
print_string("\n");
current = current.next;
}
return 0;
}
fn sum_list(node* head) i64 {
i64 sum = 0;
node* current = head;
while current != 0 {
sum = sum + current.val;
current = current.next;
}
return sum;
}
fn main() i64 {
node* head = alloc_node(10);
alloc_next_node(head, 20);
alloc_next_node(head, 30);
alloc_next_node(head, 40);
i64 total = sum_list(head);
print_string("Sum: ");
print_integer(total);
print_string("\n");
print_all_elems(head);
free_list(head);
return 0;
}