编程小站



和我一起走进编程的世界

1.9 函数、递归与递推

函数的作用,一是为了减少代码量,二是为了便于调试。

如果将所有代码的运行部分全部写在主函数中,那么调试的时候,只能一行一行调试

然而如果封装了函数,可以只调试对应的函数。

在编码中,能封装成函数,尽量封装成函数,这样会使你的思路更加清晰,逻辑更加简洁。

返回值类型 函数名(形式参数类型 形式参数名){//可以有多个形式参数
    函数内容;
    return 返回值;
}
//若没有返回值,则返回值类型应用void

返回值类型即变量类型,例如:

变量类型名称存储的内容上限
int整型整数2^31-1
long int长整型整数2^31-1
long long int超长整形整数2^63-1
float浮点型小数3.4E+38
double双精度浮点型小数1.7*10(308)
char字符型字符/
bool布尔型true/false/

我们来举个例子:

bool is_prime(x){
    for(int i = 2; i*i <= x; i++){
        if(x % i == 0)return false;
    }
    return true;
}

上面是一个判断质数的函数

值得注意的是,当函数运行到返回值语句时,这个函数就结束了。

递归

1.定义:程序调用自身的编程技巧叫做递归

2.递归程序的组成部分:

​ 1:设计递归函数的语义信息

​ 2:边界条件处理

​ 3:针对于问题的处理过程递归过程

​ 4:结果返回

下面来用递归写一个阶乘程序:

#include <iostream>
#include <cstdio>
using namespace std;
long long int factorial (int x){
    if(x<=1)return 1;
        else return x *= (factorial(x-1));
}
int main()
{
    int a;
    cin >> a;
    cout << factorial(a);
    return 0;
}

函数指针

返回值类型 函数名(所调用函数的返回值类型 (*所调用函数的函数名)(所调用函数的形式参数类型)){
    函数语句;
    return 返回值;
}

扩展欧几里得算法

#include <iostream>
#include <cstdio>
using namespace std;
int kz_gcd(int a, int b, int *x, int *y){
    if(!b) {
        *x = 1, *y = 0;
        return a;
    }
    int xx,yy,ret = kz_gcd(b,a%b,&xx,&yy);
    *x=yy;
    *y=xx-(a/b)*yy;
    return ret;
}
int main(){
    int a,b,x,y;
    while (~scanf("%d%d", &a, &b)){
        printf("%d和%d的最大公约数为%d\n", a, b, kz_gcd(a,b,&x,&y));
        printf("%d*%d+%d*%d=%d",a,x,b,y,a*x+b*y);
    }
}

变参函数

函数名函数作用
va_list获得a后面的参数列表
va_start获得a后面的第一个参数
va_arg获得下一个参数
va_end获得最后一个参数
#include <iostream>
#include <stdio.h>
#include <stdarg.h>
using namespace std;
int max_int(int n, ... ){//...代表可变参数列表
        int ans = 0;//设置变量ans用来存储答案
        va_list arg;//声明变量arg,用来存储参数列表
        va_start(arg,n);//使arg中的n成为第一个参数
    while(n--){//循环n次
        int tmp = va_arg(arg,int);//声明变量tmp,用于arg中某一参数的值
        if(tmp > ans) ans = tmp;   //如果ans>tmp,则更新ans
    }
        va_end(arg);//结束arg
        return ans;
}
int main(){
    int a,b,c;
    cin>>a>>b>>c;
    cout<<max_int(a,b,c);
}
最近的文章

素数、素数筛和线性筛

线性筛详解…

继续阅读
更早的文章

1.8 逻辑的短路

C语言中逻辑的短路…

继续阅读