函数_Part1
代码封装函数的好处:提高了代码的可读性,且能有效降低 bug 率,简化思维逻辑。
一、函数说明
函数的声明:通俗的来说就是宣布一个声明 :int is_prime(int x);
函数的定义:通俗的来说就是实现一个功能
int is_prime(int x) {
for (int i = 2; i <= x / 2; ++i) {
if (x % i == 0) {
return 0;
}
}
return 1;
}
int 返回值
is_prime 函数名(不仅要遵循命名规则,且应见名知意)
int x 参数声明列表
随堂练习-1
请实现一个程序,先读入两个整数,k,b,输出 y = k * x + b 直线方程中 x = 1 到 x = 100 时的 y 的值
#include <stdio.h> int f(int k, int b, int x) { return k * x + b; } int main() { int k, b; scanf("%d%d", &k, &b); for (int i = 0; i <= 100; ++i) { printf("f(%d) = %d\n", i, f(k, b, i)); } return 0; }
二、 K & r 风格的函数定义
上古级函数:
int is_prime(x)
int x;
{
for (int i = 2; i <= x / 2; ++i) {
if (x % i == 0) {
return 0;
}
}
return 1;
}
三、递归程序
程序调用自身的编程技巧叫做递归。(没有递归算法的叫法,递归是编程技巧而不是算法)
递归程序的组成部分:
(确定递归函数语意信息,比如 fun(n) 函数的意义)
- 边界条件处理(递归出口)
- 针对于问题的处理过程和递归过程
- 结果返回(return、传出参数 --> 传地址)
大问题 --> 较小问题 --> 可解
随堂练习-2
请实现一个程序,读入 n, 计算 n 的阶乘
#include <stdio.h> int fun(int n) { if (n == 1) { return 1; } return n * fun(n - 1); } int main() { int n; while (~scanf("%d", &n)) { printf("n! = %d\n", fun(n)); } return 0; }
递归函数执行流程:向下递推 —> 向上回溯
可借助数学归纳法证明方式证明函数的正确性。fun(1) = 1,假设 fun(k) 成立,由 fun(k) ==> fun(k + 1) 成立。
递归函数调用借用了系统栈,调用顺序与执行顺序相反。
四、函数指针
int g(int (*f1)(int), int (*f2)(int), int (*f3)(int), int x) {
if (x < 0) {
return f1(x);
}
if (x < 100) {
return f2(x);
}
return f3(x);
}
如果需要将函数作为参数传递,需要将函数定义成函数指针变量作为参数去传递。
函数指针的应用:PE-45 函数指针的应用(欧拉计划45题)
#include <stdio.h>
long long triangle(long long n) {
return n * (n + 1) >> 1;
}
long long pentagonal(long long n) {
return n * (3 * n - 1) >> 1;
}
long long heaxgonal(long long n) {
return n * (2 * n - 1);
}
long long binary_search(long long (*arr)(long long), long long n, long long x) {
long long head = 1, tail = n, mid;
while (tail <= head) {
mid = (head + tail) >> 1;
if (arr(mid) == x) return mid;
if (arr(mid) < x) head = mid + 1;
else tail = mid - 1;
}
return -1;
}
int main() {
long long n = 143;
while (1) {
n++;
long long temp = heaxgonal(n);
if (binary_search(triangle, temp, temp) == -1) continue;
if (binary_search(pentagonal, temp, temp) == -1) continue;
printf("next number is %lld\n", temp);
break;
}
return 0;
}