// ===== CodeLab: C 函数与递归 =====
// 来源: https://aoerliang.dpdns.org/articles/c-functions
// 以下代码片段按文章出现顺序拼接, 共 6 段

// ----- 片段 1 (c) -----
#include <stdio.h>

// 返回两个整数中较大的一个
int max(int a, int b) {
    if (a > b) {
        return a;
    }
    return b;
}

int main(void) {
    printf("max(3, 7) = %d\n", max(3, 7));  // 7
    return 0;
}

// ----- 片段 2 (c) -----
#include <stdio.h>

int add(int a, int b);   // 函数声明(原型)

int main(void) {
    int sum = add(3, 4);
    printf("3 + 4 = %d\n", sum);
    return 0;
}

int add(int a, int b) {  // 函数定义
    return a + b;
}

// ----- 片段 3 (c) -----
#include <stdio.h>

void try_change(int x) {
    x = 999;
}

int main(void) {
    int a = 10;
    try_change(a);
    printf("a 仍然是 %d\n", a);  // 10,没变
    return 0;
}

// ----- 片段 4 (c) -----
#include <stdio.h>

double circle_area(double r) {
    return 3.14159 * r * r;
}

int main(void) {
    double total = circle_area(1.0) + circle_area(2.0);
    printf("两个圆面积之和 = %.2f\n", total);
    return 0;
}

// ----- 片段 5 (c) -----
#include <stdio.h>

long long factorial(int n) {
    if (n <= 1) {
        return 1;          // 基准情形
    }
    return n * factorial(n - 1);   // 递推公式
}

int main(void) {
    printf("10! = %lld\n", factorial(10));  // 3628800
    return 0;
}

// ----- 片段 6 (c) -----
#include <stdio.h>

// 递归版:直观但慢
long long fib_rec(int n) {
    if (n <= 1) return n;
    return fib_rec(n - 1) + fib_rec(n - 2);
}

// 循环版:快
long long fib_loop(int n) {
    long long a = 0, b = 1;
    for (int i = 2; i <= n; i++) {
        long long t = a + b;
        a = b;
        b = t;
    }
    return n == 0 ? a : b;
}

int main(void) {
    printf("fib(30) 递归 = %lld\n", fib_rec(30));
    printf("fib(30) 循环 = %lld\n", fib_loop(30));
    return 0;
}
