-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: iteration & recursion in Zig (#804)
* iteration & recursion in Zig * missing part in time_complexity.md (zig) * build.zig sync * Update recursion.zig * Update iteration.zig --------- Co-authored-by: Yudong Jin <[email protected]>
- Loading branch information
Showing
4 changed files
with
215 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
// File: iteration.zig | ||
// Created Time: 2023-09-27 | ||
// Author: QiLOL ([email protected]) | ||
|
||
const std = @import("std"); | ||
const Allocator = std.mem.Allocator; | ||
|
||
// for 循环 | ||
fn forLoop(n: usize) i32 { | ||
var res: i32 = 0; | ||
// 循环求和 1, 2, ..., n-1, n | ||
for (1..n+1) |i| { | ||
res = res + @as(i32, @intCast(i)); | ||
} | ||
return res; | ||
} | ||
|
||
// while 循环 | ||
fn whileLoop(n: i32) i32 { | ||
var res: i32 = 0; | ||
var i: i32 = 1; // 初始化条件变量 | ||
// 循环求和 1, 2, ..., n-1, n | ||
while (i <= n) { | ||
res += @intCast(i); | ||
i += 1; | ||
} | ||
return res; | ||
} | ||
|
||
// while 循环(两次更新) | ||
fn whileLoopII(n: i32) i32 { | ||
var res: i32 = 0; | ||
var i: i32 = 1; // 初始化条件变量 | ||
// 循环求和 1, 4, ... | ||
while (i <= n) { | ||
res += @intCast(i); | ||
// 更新条件变量 | ||
i += 1; | ||
i *= 2; | ||
} | ||
return res; | ||
} | ||
|
||
// 双层 for 循环 | ||
fn nestedForLoop(allocator: Allocator, n: usize) ![]const u8 { | ||
var res = std.ArrayList(u8).init(allocator); | ||
defer res.deinit(); | ||
var buffer: [20]u8 = undefined; | ||
// 循环 i = 1, 2, ..., n-1, n | ||
for (1..n+1) |i| { | ||
// 循环 j = 1, 2, ..., n-1, n | ||
for (1..n+1) |j| { | ||
var _str = try std.fmt.bufPrint(&buffer, "({d}, {d}), ", .{i, j}); | ||
try res.appendSlice(_str); | ||
} | ||
} | ||
return res.toOwnedSlice(); | ||
} | ||
|
||
// Driver Code | ||
pub fn main() !void { | ||
const n: i32 = 5; | ||
var res: i32 = 0; | ||
|
||
res = forLoop(n); | ||
std.debug.print("\nfor 循环的求和结果 res = {}\n", .{res}); | ||
|
||
res = whileLoop(n); | ||
std.debug.print("\nwhile 循环的求和结果 res = {}\n", .{res}); | ||
|
||
res = whileLoopII(n); | ||
std.debug.print("\nwhile 循环(两次更新)求和结果 res = {}\n", .{res}); | ||
|
||
const allocator = std.heap.page_allocator; | ||
const resStr = try nestedForLoop(allocator, n); | ||
std.debug.print("\n双层 for 循环的遍历结果 {s}\n", .{resStr}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
// File: recursion.zig | ||
// Created Time: 2023-09-27 | ||
// Author: QiLOL ([email protected]) | ||
|
||
const std = @import("std"); | ||
|
||
// 递归函数 | ||
fn recur(n: i32) i32 { | ||
// 终止条件 | ||
if (n == 1) { | ||
return 1; | ||
} | ||
// 递:递归调用 | ||
var res: i32 = recur(n - 1); | ||
// 归:返回结果 | ||
return n + res; | ||
} | ||
|
||
// 使用迭代模拟递归 | ||
fn forLoopRecur(comptime n: i32) i32 { | ||
// 使用一个显式的栈来模拟系统调用栈 | ||
var stack: [n]i32 = undefined; | ||
var res: i32 = 0; | ||
// 递:递归调用 | ||
var i: usize = n; | ||
while (i > 0) { | ||
stack[i - 1] = @intCast(i); | ||
i -= 1; | ||
} | ||
// 归:返回结果 | ||
var index: usize = n; | ||
while (index > 0) { | ||
index -= 1; | ||
res += stack[index]; | ||
} | ||
// res = 1+2+3+...+n | ||
return res; | ||
} | ||
|
||
// 尾递归函数 | ||
fn tailRecur(n: i32, res: i32) i32 { | ||
// 终止条件 | ||
if (n == 0) { | ||
return res; | ||
} | ||
// 尾递归调用 | ||
return tailRecur(n - 1, res + n); | ||
} | ||
|
||
// 斐波那契数列 | ||
fn fib(n: i32) i32 { | ||
// 终止条件 f(1) = 0, f(2) = 1 | ||
if (n == 1 or n == 2) { | ||
return n - 1; | ||
} | ||
// 递归调用 f(n) = f(n-1) + f(n-2) | ||
var res: i32 = fib(n - 1) + fib(n - 2); | ||
// 返回结果 f(n) | ||
return res; | ||
} | ||
|
||
// Driver Code | ||
pub fn main() !void { | ||
const n: i32 = 5; | ||
var res: i32 = 0; | ||
|
||
res = recur(n); | ||
std.debug.print("\n递归函数的求和结果 res = {}\n", .{recur(n)}); | ||
|
||
res = forLoopRecur(n); | ||
std.debug.print("\n使用迭代模拟递归的求和结果 res = {}\n", .{forLoopRecur(n)}); | ||
|
||
res = tailRecur(n, 0); | ||
std.debug.print("\n尾递归函数的求和结果 res = {}\n", .{tailRecur(n, 0)}); | ||
|
||
res = fib(n); | ||
std.debug.print("\n斐波那契数列的第 {} 项为 {}\n", .{n, fib(n)}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters