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 逻辑的短路

逻辑的短路先让我们来看一段代码:int a = 0;int b = 0;if(a++&&b++){ printf("True");} printf("a:%d,b:%d",a,b);运行上述代码,我们得到的结果是a:1 b:0这是为什么呢?…

继续阅读
更早的文章

2.0 数组与指针

你知道计算机为什么有32位和64位之分吗?首先,计算机是以二进制进行运算和存储的。每一个变量,在计算机中,都有其唯一的“地址”,而这地址就是用二进制来存储的。一个0/1(二进制的一位)叫做一个比特(bit),八个比特叫做一个字节(b)。一千个字节叫做kb,简称k;一兆字节叫做mb,简称m;一千兆字节…

继续阅读