【函数和函数递归】

简介: 【函数和函数递归】

一、库函数

1. strcpy----字符串拷贝

把arr1的内容拷贝到arr2

int main()
  {
    char arr1[] = "bit";
    char arr2[] = "########";
    strcpy(arr2, arr1);             
    printf("%s\n",arr2);
    return 0;
  }

2. memset函数

用‘ * '代替arr数组前5个字符

int main()
  {
    char arr[] = "hello world";
    memset(arr, '*', 5);
    printf("%s\n", arr);
    return 0;
  }

二、自定义函数

2.1 实际参数(实参)

真实传给函数的参数,叫实参

2.2 形式参数(形参)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内

存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

2.3 写一个函数可以交换两个整型变量的内容

*pa,*pb是形参,需要在函数内改变实参的值的时候应该用传址调用

void Swap(int *pa,int *pb)                           
  {                                                      
    int tmp = 0;                                            
    tmp = *pa;                                          
    *pa = *pb;                                               
    *pb = tmp;                                               
  }

&a,&b是实参

int main()                                             
  {
    int a = 10;
    int b = 20;
    printf("a = %d  b = %d\n", a, b);
    Swap(&a,&b);                                          
    printf("a = %d  b = %d\n", a, b);
    return 0;
  }

注意,如果上面采用传值调用, 不能交换两个变量的值,因为a,b传到x,y时x,y也有自己独立的地址,并没有改变x,y的地址,如:

void Swap(int a, int b)
        {
        int tmp = 0;
      tmp = a;
      a = b;
      b = tmp;
      }

三、函数的声明和定义

3.1 函数声明:

  1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
    声明决定不了。
  2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
  3. 函数的声明一般要放在头文件中的。

3.2 函数定义:

函数的定义是指函数的具体实现,交待函数的功能实现。

四、函数递归

练习1

调用函数自己本身,例如,接受一个整型值(无符号),按照顺序打印它的每一位。

输入:1234,输出1 2 3 4

执行print时会返回执行上一层没有执行完的print

void print(int n)
  {
    if (n > 9)
    {
      print(n/10);                     
    }
    printf("%d ", n % 10);
  }
  int main()
  {
    unsigned int num = 0;
    printf("请输入一个数字:\n");
    scanf("%d", &num);
    print(num);
    return 0;
  }

练习2

编写函数不允许创建临时变量,求字符串的长度

创建临时变量的写法:

int my_strlen(char *str)
  {
    int count = 0;             //count是临时变量
    while (*str != '\0')
    {
      count++;
      str++;
    }
    return count;
  }
  int main()
  {
    char arr[] = "bit";
    int len = my_strlen(arr);
    printf("%d\n",len);
    return 0;
  }

不创建临时变量----递归;

递归的方法–把大事化小,首先把字符串首地址传入函数,然后判断字符不是’ \0 '就调用函数本身

my_strlen(“bit”);

1+my_strlen(“it”);

1+1+my_strlen(“t”);

1+1+1+my_strlen(“t”);

1+1+1+0=3;

int my_strlen(char* str)
  {                                                                                     
    if (*str != '\0')                                                                  
      return 1 + my_strlen(str + 1);       //此处str+1是地址,要传到函数去                
    else                                                                              
      return 0;                                                                    
  }                                                                                    
  int main()
  {
    char arr[] = "bit";
    int len = my_strlen(arr);
    printf("len = %d\n", len);
    return 0;
  }

练习3

求n的阶乘。(不考虑溢出)

int function(int n)
  {
    if (n != 0)
      return n * function(n - 1);
    else
      return 1;
  }
  int main()
  {
    int n = 0;
    printf("请输入一个数:\n");
    scanf("%d", &n);
    int ret = function(n);
    printf("ret = %d\n", ret);
    return 0;
  }
目录
相关文章
C4.
|
2月前
|
C语言
C语言函数的递归调用
C语言函数的递归调用
C4.
14 0
|
7月前
函数递归(详细解读)(下)
函数递归(详细解读)(下)
|
7月前
|
算法
函数递归(详细解读)(上)
函数递归(详细解读)(上)
|
7天前
|
算法 Python
函数的递归调用与嵌套调用详解
函数的递归调用与嵌套调用详解
12 0
|
2月前
|
算法 Serverless Python
函数的递归调用
在编程中,递归是一种非常强大的技术,它允许函数直接或间接地调用自身。递归调用使得某些问题的解决变得简单而优雅,尤其是那些具有自然分治结构的问题。本文将介绍函数的递归调用概念,并通过示例代码展示其应用。
15 1
|
5月前
|
算法 C语言
你会使用函数的递归和迭代吗?----------C语言函数学习(4)详解
你会使用函数的递归和迭代吗?----------C语言函数学习(4)详解
76 1
|
2月前
|
算法 Java C语言
C语言函数的递归
C语言函数的递归
8 0
|
4月前
|
机器学习/深度学习 编译器 C语言
关于函数递归的基础
关于函数递归的基础
33 5
|
8月前
|
算法 C语言
C语言函数递归练习详解
C语言函数递归练习详解
|
10月前
|
算法 C语言
函数的递归
当我们在生活中遇到一个复杂问题时,我们会想方设法将其解决,这时我们会有很多种方法,我们可以将问题一步一步顺序化,也可以使用逆向思维将其巧妙化解。C语言中就给我们提供了一种将问题大事化小思想——递归。
52 0

热门文章

最新文章