【程序的函数】

程序函数


一、递归

  • 边界条件处理(递归出口)
  • 针对问题的处理过程和递归过程
  • 结果返回

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 ax+by=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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值