程序函数
一、递归
- 边界条件处理(递归出口)
- 针对问题的处理过程和递归过程
- 结果返回
1、例子
阶乘
#include <stdio.h>
int fac(int n){
if(n == 1)return 1;
return n * fac(n - 1);
}
int main(){
int n;
while(~scanf("%d",&n)){
printf("fac= %d\n",fac(n));
}
return 0;
}
2、式子推导方法: 数学归纳法
f
(
1
)
f(1)
f(1)成立,
假设
f
(
k
)
f(k)
f(k)成立,
若有递推式另
f
(
k
)
f(k)
f(k)推出
f
(
k
+
1
)
f(k+1)
f(k+1)成立,
则该式子针对每一个值都成立
二、函数指针(长时间无法响应)
#include <stdio.h>
#include <inttypes.h>
int64_t tr(int64_t n){
return n * (n + 1) / 2;
}
int64_t pr(int64_t n){
return n * (3 * n - 1) / 2;
}
int64_t hr(int64_t n){
return n * (2 * n + 1) / 2;
}
int64_t bs(int64_t (*arr)(int64_t),int64_t n,int64_t x){
int64_t head = 1,tail = n,mid;
while(head <= tail){
mid = (head + tail) >> 1;//相当于/2的位运算
if(mid < 0)printf("error\n");
if(arr(mid) == x) return mid;
if(arr(mid) < x) head = mid + 1;
else tail = mid -1;
}
return 0;
}
int main(){
int n = 143;
while(1){
n++;
int64_t tempt = hr(n);
if(bs(tr,tempt,tempt) == 0)continue;
if(bs(pr,tempt,tempt)==0)continue;
printf("%ld\n",tempt);
break;
}
return 0;
}
三、变参函数
从若干个参数中返回最大值
int max_int(int a,...)
- 获得a往后的参数列表:va_list类型的变量
- 定位a后的第一个参数的位置:va_start类型的变量
- 获取下一个可变参数列表中的参数:va_arg类型的变量
- 结束整个获取可变参数列表的动作:va_end类型的变量
代码演示
#include <stdio.h>
#include <stdarg.h>
#include <climits>
int max_int(int n, ...){
int ans = INT_MIN;
va_list arg;
va_start(arg,n);
while(n--) {
int temp = va_arg(arg,int);
if(temp > ans) ans = temp;
}
va_end(arg);
return ans;
}
int main(){
printf("max = %d\n",max_int(3,12,55,45));
return 0;
}
四、欧几里德算法(辗转相除法)
- 快速计算两个数字的最大公约数
- *快速求解 a ∗ x + b ∗ y = 1 a*x + b* y = 1 a∗x+b∗y=1方程的一组整数解
#include <stdio.h>
int gys(int a, int b){
return (b ? gys(b,a % b) : a);
}
int main(){
int a,b;
while(~scanf("%d%d",&a,&b)){
printf("gcd(%d,%d) = %d\n",a,b,gys(a,b));
}
return 0;
}