Skip to content

Instantly share code, notes, and snippets.

@jeovazero
Last active August 6, 2023 02:03
Show Gist options
  • Save jeovazero/9fbe5f82a40469163e1346b56bebdd1d to your computer and use it in GitHub Desktop.
Save jeovazero/9fbe5f82a40469163e1346b56bebdd1d to your computer and use it in GitHub Desktop.
fac n = fac' n 1
fac' n acc =
guard
| n == 0 -> acc
| n < 3 -> n * acc
| else -> fac' (n - 1) (acc * n)
int fac(int n) => fac_(n, 1);
int fac_(int n, int acc) {
if (n == 0) return acc;
if (n < 3) return n * acc;
return fac_(n - 1, acc * n);
}
void main() {
print(fac(5));
}
int fac(int n) => fac_(n, 1);
int fac_(int n, int acc) {
late int ans; // answer
var n_ = n;
var acc_ = acc;
while (true) {
if (n_ == 0) {
ans = acc_;
break;
}
if (n_ < 3) {
ans = n_ * acc_;
break;
}
var n__ = n_ - 1;
var acc__ = acc_ * n_;
n_ = n__;
acc_ = acc__;
}
return ans;
}
void main() {
print(fac(5));
print(fac(2));
print(fac(1));
print(fac(0));
}
-- BASIC MATH
-- 0! = 1
-- 1! = 1
-- 2! = 2 * 1
-- n! = n * n - 1 * .. * 2 * 1
-- fac n = n!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment