diff --git a/.idea/misc.xml b/.idea/misc.xml
index fc4f7d3..bbd63f7 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -47,6 +47,12 @@
+
+
+
+
+
+
diff --git a/.idea/rust.iml b/.idea/rust.iml
index 42a672f..59fd6f5 100644
--- a/.idea/rust.iml
+++ b/.idea/rust.iml
@@ -189,6 +189,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 19b7c83..fd96edf 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,18 +2,10 @@
-
+
+
-
-
-
-
-
-
-
-
-
-
+
@@ -22,7 +14,26 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
@@ -128,6 +139,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -151,22 +191,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -200,7 +229,7 @@
-
+
@@ -229,6 +258,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -259,16 +298,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -278,11 +307,11 @@
+
-
@@ -319,10 +348,11 @@
-
+
+
-
-
+
+
@@ -330,7 +360,7 @@
-
+
@@ -346,88 +376,13 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -449,26 +404,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -494,19 +430,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -514,13 +437,6 @@
-
-
-
-
-
-
-
@@ -528,13 +444,6 @@
-
-
-
-
-
-
-
@@ -680,17 +589,6 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -698,13 +596,7 @@
-
-
-
-
-
-
-
+
@@ -731,10 +623,106 @@
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/__non-book-expirements__/fibonacci/src/main.rs b/__non-book-expirements__/fibonacci/src/main.rs
index 7bdc046..84d5fef 100644
--- a/__non-book-expirements__/fibonacci/src/main.rs
+++ b/__non-book-expirements__/fibonacci/src/main.rs
@@ -3,23 +3,29 @@ extern crate separator;
use separator::Separatable;
use std::io;
+use std::u128;
///! Calculate a number in the fibonnacci sequence,
///! using a lookup table for better worst-case performance.
///
/// Can calculate up to 186 using native unsigned 128 bit integers.
-fn fibonacci(n: usize, table: &mut Vec) -> u128 {
+fn fibonacci(n: usize, table: &mut Vec) -> Option {
match table.get(n) {
- Some(x) => *x, // Vec.get returns a Option with a reference to the value, so deref
+ Some(x) => Some(*x), // Vec.get returns a Option with a reference to the value, so deref
None => {
- let a = n - 1;
- let b = n - 2;
+ let a = fibonacci(n - 1, table)
+ .unwrap_or(u128::MAX);
+ let b = fibonacci(n - 2, table)
+ .unwrap_or(u128::MAX);
- let current = fibonacci(a, table) + fibonacci(b, table);
+ // Check for overflow when adding
+ let attempt = a.checked_add(b);
- table.insert(n, current);
+ if let Some(current) = attempt {
+ table.insert(n, current);
+ }
- current
+ attempt
}
}
}
@@ -44,9 +50,16 @@ fn main() {
Err(_) => break, // Exit on non-number
};
- let calculated = fibonacci(index, &mut table);
-
println!("Calculating number for index: {}", index);
- println!("The Fibonnacci number at index: {} is {}", index, calculated.separated_string());
+
+ match fibonacci(index, &mut table) {
+ Some(calculated) => {
+ println!("The Fibonacci number at index: {} is {}", index, calculated.separated_string());
+ },
+ None => {
+ println!("Calculation overflow. The factorial base was too large.");
+ }
+ }
+
}
}