Little Grey habla de funciones

1. ¿Qué es una función?

inserte la descripción de la imagen aquí

  C语言函数是一种函数,用来编译C语言,
一般包括字符库函数,数学函数,目录函数,
进程函数,诊断函数,操作函数等

2. Funciones de biblioteca y funciones personalizadas

(1) Funciones de
biblioteca Las funciones de biblioteca son una forma de encapsular funciones en bibliotecas para que las utilicen los usuarios. El método es compilar algunas funciones de uso común en un archivo para que las llamen diferentes personas. Al llamar a la función correspondiente, agregue el nombre del archivo donde se encuentra con #include<>. Por lo general, se coloca en el archivo lib.
Por ejemplo `

#include<math.h>  
//数学函数:包括常用的三角函数、指数和对数函数等。例如sqrt(开平方),pow(x的y次方)等。

#include<string.h>  
//字符串函数:于字符串操作函数:strcat,strchr,strcmp,strcpy,strlen,strstr等。

#include<time.h>
//时间函数:时间、日期和与系统有关的函数。对时间、日期的操作和设置计算机系统状态等。

Un breve resumen, las funciones de biblioteca comúnmente utilizadas en el lenguaje C son:
Función IO Función
de manipulación de cadenas Función de manipulación de
caracteres Función de manipulación de
memoria Función de
hora/fecha Función
matemática
Otras funciones de biblioteca

(2) Funciones personalizadas
Si las funciones de la biblioteca pueden hacer todo, ¿qué debe hacer el programador?
inserte la descripción de la imagen aquí

Así que más importante es la función personalizada. Al igual que las funciones de biblioteca, las funciones personalizadas tienen nombres de función, tipos de valor de retorno y parámetros de función. Pero la diferencia es que todos estos están diseñados por nosotros. Esto les da a los programadores mucho espacio para jugar.
La composición de la función:

 ret_type fun_name(para1, * )
{
    
    
 statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1    函数参数

Como escribir una función para sumar

int My_Add(int a, int b)
{
    
    
  int c=0;
  c=a+b;
  return c;
}
//int 表示返回类型为整形,My_Add为函数名
//int a 和int b 表示参数类型为整形
//return c表示将c以整形返回

3. Parámetros de función

(1) Parámetros reales (parámetros reales):
Los parámetros que realmente se pasan a la función se denominan parámetros reales.
Los argumentos pueden ser: constantes, variables, expresiones, funciones, etc. Independientemente del tipo de cantidades que sean los parámetros reales, deben tener valores definidos para poder pasar esos valores a los parámetros formales cuando se llama a la función.
(2) Parámetros formales (parámetros formales):
Los parámetros formales se refieren a las variables entre paréntesis después del nombre de la función, porque los parámetros formales solo se instancian (unidades de memoria asignadas) cuando se llama a la función, por lo que se denominan parámetros formales. Los parámetros formales se destruyen automáticamente cuando se completa la llamada a la función. Por lo tanto, los parámetros formales solo son válidos dentro de las funciones
.
**Cabe señalar que:** La transferencia de datos que se produce en la llamada de función es unidireccional, solo el valor del parámetro real se puede pasar al parámetro formal y el valor del parámetro formal no se puede pasar a el parámetro real a la inversa; en otras palabras, una vez que se completa la transferencia de datos, el parámetro real y el parámetro formal ya no están relacionados, por lo que durante la llamada de función, el valor del parámetro formal cambia y el parámetro real no se verá afectado .

4. Llamada de función:

(1) Llamada por valor
Los parámetros formales y los parámetros reales de la función ocupan diferentes bloques de memoria respectivamente, y la modificación de los parámetros formales no afectará a los parámetros reales.
(2) Llamada
por referencia La llamada por referencia es una forma de llamar a una función pasando la dirección de memoria de la variable creada fuera de la función al parámetro de función.
Este método de pasar parámetros permite que la función establezca una conexión real con las variables fuera de la función, es decir, la función puede operar directamente las variables fuera de la función.

5. Llamadas anidadas y acceso encadenado a funciones

Las funciones y funciones se pueden combinar según las necesidades reales, es decir, se pueden llamar entre sí.
Por ejemplo, el siguiente código es una llamada anidada de una función

#include <stdio.h>
void new_line()
{
    
    
 printf("hehe\n");
}
void three_line()
{
    
    
    int i = 0;
 for(i=0; i<3; i++)
   {
    
    
        new_line();
   }
}
int main()
{
    
    
 three_line();
 return 0; 
}

Las llamadas anidadas son cuando una función llama a otra función (es decir, el anidamiento de funciones permite que una función llame a otra función). Las funciones se pueden llamar definiciones anidadas, pero no anidadas

6. Declaración y Definición de Funciones

Declaración de función :

  1. Dígale al compilador cómo se llama una función, cuáles son los parámetros y cuál es el tipo de retorno. Pero si existe o no, no está determinado por la
    declaración de la función.
  2. La declaración de una función generalmente aparece antes del uso de la función. Para satisfacer la declaración antes de su uso.
  3. Las declaraciones de funciones generalmente se colocan en archivos de encabezado.
    Definición de función:
    La definición de una función se refiere a la implementación específica de la función, explicando la implementación de la función de la función.
    declaración de función
#ifndef __TEST_H__
#define __TEST_H__
//函数的声明
int Add(int x, int y);

Definición de función: es decir, para explicar la realización de función función

//函数Add的实现
int Add(int x, int y) 
{
    
    
 return x+y; 
}

7. Recurrencia de funciones

(1) ¿Qué es la recursividad?
La técnica de programación en la que un programa se llama a sí mismo se llama recursividad. La recursividad como algoritmo es ampliamente utilizada en lenguajes de programación. Un procedimiento o función en su definición o descripción tiene
un método de llamarse a sí mismo directa o indirectamente, lo que generalmente transforma un problema grande y complejo en un problema más pequeño similar al problema original a resolver.La estrategia recursiva solo se puede resolver un número reducido de programas. se utiliza para describir los cálculos repetidos necesarios para el proceso de resolución de problemas, lo que reduce en gran medida la cantidad de código del programa.
La forma principal de pensar acerca de la recursividad es: hacer pequeñas las cosas grandes
(2) Dos condiciones necesarias para la recursividad
Hay una condición de restricción, cuando se cumple esta condición de restricción, la recursividad no continuará. Se acerca más y más a este límite después de cada llamada recursiva.
Ejercicio
Tome un valor entero (sin signo) e imprima sus bits en orden.
Por ejemplo:
entrada: 1234, salida 1 2 3 4.
Código de referencia:

#include <stdio.h>
void print(int n) 
{
    
    
 if(n>9)
 {
    
    
 print(n/10);
 }
 printf("%d ", n%10);
}
int main()
{
    
    
 int num = 1234;
 print(num);
 return 0; 
 }

recursión e iteración

Ejercicio 2 : Encuentra el factorial de n. (independientemente del desbordamiento)
código de referencia:

nt factorial(int n) 
{
    
    
 if(n <= 1)
 return 1;
 else
 return n * factorial(n-1);
}

Ejercicio 3:
Encuentra el n-ésimo número de Fibonacci. (independientemente del desbordamiento)
código de referencia:

int fib(int n) 
{
    
    
 if (n <= 2)         
 return 1;
    else
    return fib(n - 1) + fib(n - 2);
}

Pero encontramos un problema :
usar la función fib requiere mucho tiempo si queremos calcular el número 50 de Fibonacci.
Use la función factorial para encontrar el factorial de 10000 (sin considerar la exactitud del resultado), el programa fallará.
¿por qué?
Descubrimos que muchos cálculos se repiten en el proceso de llamar a la función fib.
Si modificamos un poco el código:

int count = 0;//全局变量
int fib(int n) 
{
    
    
 if(n == 3)
 count++;
 if (n <= 2)         
 return 1;
    else
    return fib(n - 1) + fib(n - 2);
}

Finalmente, sacamos para ver el conteo, que es un valor muy grande. Entonces, ¿cómo podemos mejorar?
Al depurar la función factorial, si su parámetro es relativamente grande, informará un error: desbordamiento de pila (stack overflow) dicha información. El espacio de pila asignado al programa por el sistema es limitado, pero si hay un bucle infinito, o (recurrencia muerta), puede conducir al desarrollo continuo del espacio de pila y eventualmente al agotamiento del espacio de pila. llamado desbordamiento de pila. .
Cómo resolver el problema anterior:

  1. Reescriba la recursividad para que sea no recursiva.
  2. Utilice objetos estáticos en lugar de objetos locales no estáticos. En el diseño de funciones recursivas, los objetos estáticos se pueden usar para reemplazar
    objetos locales no estáticos (es decir, apilar objetos), lo que
    no solo puede reducir la sobrecarga de generar y liberar objetos no estáticos durante cada llamada y devolución recursiva, sino que también
    ahorra el Intermedio de la llamada recursiva. estado y se puede acceder a través de
    varias capas de llamadas.

El siguiente código se utiliza de forma no recursiva:

//求n的阶乘
int factorial(int n) 
{
    
    
        int result = 1;
        while (n > 1)
       {
    
    
             result *= n ;
             n -= 1;
       }
        return result; 
 }
//求第n个斐波那契数
int fib(int n) 
{
    
    
     int result;
     int pre_result;
     int next_older_result;
     result = pre_result = 1;
      while (n > 2)
     {
    
    
           n -= 1;
           next_older_result = pre_result;
           pre_result = result;
           result = pre_result + next_older_result;
     }
     return result; 
}

insinuación:

  1. Muchos problemas se explican en forma recursiva simplemente porque es más claro que la forma no recursiva.
  2. Pero las implementaciones iterativas de estos problemas tienden a ser más eficientes que las implementaciones recursivas, aunque el código es un poco menos legible.
  3. Cuando un problema es demasiado complejo para implementarlo de forma iterativa, la simplicidad de la implementación recursiva puede compensar la sobrecarga de tiempo de ejecución que impone
    .
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_62316056/article/details/124112429
Recomendado
Clasificación