首页 > 其他分享 >C函数

C函数

时间:2023-05-04 16:46:31浏览次数:19  
标签:return 函数 递归 int printf long 2023

C函数

  1. 关键字return
  2. 运算符---*&
  3. 如何把指针变量用作函数参数
  4. 函数类型
  5. 递归

return的使用

示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 4:07:12 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 4:07:12 PM
 * Description: 两数比较大小,返回更小的.使用return
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
int imin(int, int);

int main(void)
{
    int numberOne, numberTwo;

    printf("输入两个整数,或者按q退出: \n");
    while (scanf("%d %d", &numberOne, &numberTwo) == 2)
    {
        printf("%d 和 %d 当中更小的是 %d. \n", numberOne, numberTwo, imin(numberOne, numberTwo));
        printf("输入两个整数,或者按q退出: \n");
    }
    printf("结束!");

    return 0;
}
/** 比较两数大小,返回最小的 */
int imin(int n, int m)
{
    int min;

    if (n < m)
        min = n;
    else
        min = m;

    return min;
}

函数原型

使用函数原型的目的:

为了让编译器第一次调用该函数的时候就知道如何使用它

示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 4:14:40 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 4:14:40 PM
 * Description: 函数原型的使用
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
int imax(int a, int b); // 不可以在声明中既是函数定义也是函数原型,会导致重定义错误

int main(void)
{
    int n, m, z;
    printf("输入两个数(或按q退出):\n");
    while (scanf("%d %d", &n, &m) == 2)
    {
        z = imax(n, m);
        printf("%d 和 %d 中更大的是 %d.\n", n, m, z);
        printf("输入两个数(或按q退出):\n");
    }
    printf("结束");

    return 0;
}

int imax(int a, int b)
{
    return a > b ? a : b;
}

递归

什么是递归?

函数自己调用自己的过程叫做递归

难点:

结束递归

递归示例:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 4:33:07 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 4:33:07 PM
 * Description: 递归的示例和递归的使用
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
void up_and_down(int);

int main(void)
{
    up_and_down(1);

    getchar();

    return 0;
}

void up_and_down(int n)
{
    printf("数 %d: n 在计算机中的存储地址是 %p \n", n, &n); // &取址符号
    if (n < 4)
        up_and_down(n + 1);
    printf("数 %d: n 在计算机中的存储地址是 %p \n", n, &n);
}

难点:

递归次数(递归结束条件)

分析:

上述代码当中一共有八段输出,up_and_down函数被调用了四次,最后一次 调用结束以后打印了四次.函数开始返回,继续打印四次.所以一共输出八段

尾递归

尾递归计算阶乘示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 5:00:01 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 5:00:01 PM
 * Description: 分别使用循环和递归计算阶乘(主要介绍尾递归)
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
long fact(int);
long rfact(int);

int main(void)
{
    int num;

    printf("这是一个计算阶乘的程序.\n");
    printf("输入0 - 12 内的整数, 按q退出.\n");
    while (scanf("%d", &num) == 1)
    {
        if (num < 0 || num > 12)
        {
            printf("重新输入!\n");
            continue;
        }
        else
        {
            printf("循环: %d 的阶乘是 %ld.\n", num, fact((long) num));
            printf("递归: %d 的阶乘是 %ld.\n", num, rfact((long) num));
        }
        printf("输入0 - 12 内的整数, 按q退出.\n");
    }

    printf("结束!");

    return 0;
}

long fact(int n)
{
    long ans;

    for (ans = 1; n > 1; n--)
        ans *= n;
    
    return ans;
}

long rfact(int n)
{
    long ans;

    if (n > 0)
        ans = n * rfact(n - 1);
    else
        ans = 1;

    return ans;
}

递归和倒序计算

一个以二进制形式表示输入数的算法:

思路:

  1. 十进制转二进制中,十进制奇数的末尾是1,偶数的末尾是0 ---> 所以通过%2来确定末尾值
  2. 如何十进制数的下一位二进制数(十进制数/2结果在%2)
  3. 结束条件,/2结果<2

示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 5:33:11 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 5:33:11 PM
 * Description: 进制转换问题,主要是解决十进制转二进制
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
void to_binary(unsigned long);

int main(void)
{
    unsigned long number;
    
    printf("输入一个正整数,q退出!.\n");
    while (scanf("%lu", &number) == 1)
    {
        printf("该数的二进制数是:\n");
        to_binary(number);
        putchar('\n');
        printf("输入一个正整数,q退出!.\n");
    }

    printf("Done!");

    return 0;
}

// 递归
void to_binary(unsigned long n)
{
    int r;

    r = n % 2; // 记录余数
    if (n >= 2) 
        to_binary(n / 2);
    putchar(r == 0 ? '0': '1');

    return;
}

双递归

示例代码:

/**
 * @Author: Lucifer
 * @Date: 5/3/2023, 5:40:35 PM
 * @LastEditors: Lucifer
 * @LastEditTime: 5/3/2023, 5:40:35 PM
 * Description: 通过斐波那契数列展示双递归使用
 * Copyright: Copyright (©)}) 2023 Your Name. All rights reserved.
 */
# include<stdio.h>
unsigned long Fibonacci(unsigned n);

int main(void)
{
    Fibonacci(10);

    return 0;
}

unsigned long Fibonacci(unsigned n)
{
    if (n > 2)
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    else
        return 1;
}

递归的缺点:

对于计算机内存资源的消耗是巨大的

头文件的使用

  • 把函数原型放在头文件中
  • 把函数定义放在第二个文件中

这样就可以不需要每次都声明函数原型了

示例程序:

标签:return,函数,递归,int,printf,long,2023
From: https://www.cnblogs.com/JunkingBoy/p/17371697.html

相关文章

  • 阿克曼-彼得函数
    TheAckermannfunctionisarecursivefunctionthattakestwonon-negativeintegersasinputsandreturnsanon-negativeintegerasoutput.Thefunctionisdefinedasfollows: 阿克曼函数是一个数学函数,它是递归定义的,并且增长非常快。它是最简单的例子之一,它是一......
  • HAL库___ADC的回调函数
    STM32CubeMx配置ADC转换完成的回调函数当使用DMA传输ADC数据时当传输完成后HAL库一般都会有回调函数。进入HAL_ADC_Start_DMA();底层可以找到传输完成后调用了ADC_DMAConvCplt; 定义过去可以看到: 最后调用了HAL_ADC_ConvCpltCallback(hadc);回调函数。ADC转换并打开中断在......
  • python 内置函数map()、filter()函数
    map()函数接受两个参数:第一个参数是一个函数,第二个参数是一个可迭代对象(如列表、元组等)。该函数会将可迭代对象中的每个元素依次传递给第一个参数指定的函数,并返回一个新的可迭代对象,其中每个元素都是原始对象经过该函数转换后的结果。具体来说,map()函数会将可迭代对象中的每个......
  • python 函数
    在Python中,函数是一段代码块,用于完成特定的任务。函数通常接受一个或多个参数,并返回一个结果。根据函数的定义方式和参数类型,可以将Python函数分为以下几类:内置函数:Python内置了很多常用的函数,如 print()、len()、int() 等。自定义函数:使用 def 关键字可以自定义函数......
  • python 匿名函数(lambda函数)
    Python中的匿名函数是指没有命名标识符的函数,通常被称为lambda函数。与普通函数不同,它们是一种更加简洁的方式来编写小型临时函数。在Python中,匿名函数使用关键字lambda来定义,其语法如下:lambdaarguments:expression其中,arguments表示函数参数,可以是一个或多个,多个参数之间用......
  • Bootstrap + Django - 前端bootstrap-table列表数据使用回调函数控制显示某一列数据
    前端bootstrap-table列表数据使用回调函数控制显示某一列数据1.效果1.有可以操作用户的权限,显示操作列2.无操作用户的权限,不显示操作列2.主要代码1.前端js<script>var$articlesTable=$('#table').bootstrapTable('destroy').bootstrapTable({url:'/team......
  • PHP获取时间戳、获取天周月的起始时间、指定时间所在周、指定时间的各个周等相关函数
    一、时间戳和日期互相转换//获取时间戳$date=time();//获取当前时间戳$date=mktime(0,0,0,10,10,2020);//获取指定时间的时间戳2020年10月10日0时0分0秒//日期转换为时间戳$date="2019-08-0808:08:08";$timestamp=strtotime($date);//将时间戳......
  • Rust中的函数指针
    通过函数指针允许我们使用函数作为另一个函数的参数。函数的类型是fn(使用小写的”f”)以免与Fn闭包trait相混淆。fn被称为函数指针(functionpointer)。指定参数为函数指针的语法类似于闭包。函数指针类型(使用关键字 fn 写出)指向那些在编译时不必知道函数标识符的函数。......
  • 函数调用栈的一些简单认识
    程序的执行可以理解为连续的函数调用,每一个用户态(用户态指的是CPU指令集权限ring0,用户只能访问常用CPU指令集,在应用程序中运行)进程都对应一个调用栈结构,当一个函数执行完毕后,会自动回到原先调用函数的位置(call指令)的下一步命令并执行,堆栈结构的作用是保存函数返回地址、传......
  • C++中的构造析构函数—2—虚析构函数
    1.构造函数不能定义为虚函数,每个对象的虚函数表指针是在构造函数中初始化的,因为构造函数没执行完,所以虚函数表指针还没初始化好。而析构函数可以定义为虚函数,也必须要定义为虚函数,否则在析构上无法体现出多态,导致子类的析构函数不会被调用,可能导致内存泄漏等风险。2.实验:#inc......