forked from starkware-libs/cairo
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfib_array.cairo
More file actions
34 lines (32 loc) · 1.1 KB
/
fib_array.cairo
File metadata and controls
34 lines (32 loc) · 1.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Returns an array of size n with the values of the Fibonacci sequence, the length of the array,
// and the value of the last element.
fn fib(n: u128) -> (Array::<felt>, felt, u128) {
let mut arr = array_new::<felt>();
array_append::<felt>(arr, 1);
array_append::<felt>(arr, 1);
let mut arr = fib_inner(n, arr);
let len = array_len::<felt>(arr);
let last = unchecked_array_at(arr, len - 1_u128);
return (arr, last, len);
}
fn fib_inner(n: u128, mut arr: Array::<felt>) -> Array::<felt> {
let length = array_len::<felt>(arr);
if n <= length {
return arr;
}
array_append::<felt>(
arr, unchecked_array_at(arr, length - 1_u128) + unchecked_array_at(arr, length - 2_u128)
);
fib_inner(n, arr)
}
// TODO(orizi): Remove when a panicable `array_at` is introduced.
fn unchecked_array_at(ref arr: Array::<felt>, idx: u128) -> felt {
match array_at::<felt>(arr, idx) {
Option::Some(v) => v,
Option::None(()) => {
let mut data = array_new::<felt>();
array_append::<felt>(data, 1);
panic(data)
},
}
}