aboutsummaryrefslogtreecommitdiff
path: root/examples/snippets/fibonacci.zig
diff options
context:
space:
mode:
Diffstat (limited to 'examples/snippets/fibonacci.zig')
-rw-r--r--examples/snippets/fibonacci.zig41
1 files changed, 41 insertions, 0 deletions
diff --git a/examples/snippets/fibonacci.zig b/examples/snippets/fibonacci.zig
new file mode 100644
index 0000000..327bbd3
--- /dev/null
+++ b/examples/snippets/fibonacci.zig
@@ -0,0 +1,41 @@
+const std = @import("std");
+
+/// Compute the nth Fibonacci number iteratively.
+pub fn fibonacci(n: u64) u64 {
+ if (n <= 1) return n;
+ var a: u64 = 0;
+ var b: u64 = 1;
+ var i: u64 = 2;
+ while (i <= n) : (i += 1) {
+ const next = a + b;
+ a = b;
+ b = next;
+ }
+ return b;
+}
+
+pub fn main(init: std.process.Init) !void {
+ const io = init.io;
+ var buf: [4096]u8 = undefined;
+ var fw: std.Io.File.Writer = .init(.stdout(), io, &buf);
+ defer fw.interface.flush() catch {};
+ const w = &fw.interface;
+
+ try w.print("Fibonacci sequence (first 12 terms):\n", .{});
+ for (0..12) |n| {
+ try w.print(" fib({d}) = {d}\n", .{ n, fibonacci(n) });
+ }
+}
+
+test "fibonacci base cases" {
+ try std.testing.expectEqual(@as(u64, 0), fibonacci(0));
+ try std.testing.expectEqual(@as(u64, 1), fibonacci(1));
+ try std.testing.expectEqual(@as(u64, 1), fibonacci(2));
+}
+
+test "fibonacci sequence" {
+ const expected = [_]u64{ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
+ for (expected, 0..) |v, n| {
+ try std.testing.expectEqual(v, fibonacci(n));
+ }
+}