C语言--函数递归与迭代

简介: C语言--函数递归与迭代

递归在书写的时候,有两个必要条件:

1.递归存在限制条件,但凡满足这个限制条件时,递归便不再继续

2.每次递归调用之后越来越接近这个限制条件

递归的思想:

把大事化小事

递归其实就是函数自己调用自己

//int main()
//{
//    printf("hehe\n");
//    main();//再次调用main函数自己
//    return 0;
//}
输出结果就是程序进入死循环,一直打印hehe
总而言之,在函数中再次调用自己就是递归
如果递归无限的递归下去,就会出现这样的错误,栈溢出
//
每一次函数调用,都要为这次函数调用分配内存空间是内存的栈区上分配的,
 如果无限的递归调用函数,就会将栈区空间使用完,
 就会出现栈溢出的现象
//递归---求n的阶乘
//n的阶乘就是1~n的数字累计相乘
//n!=n*(n-1)!
//当n=0时,n的阶乘为1
 
//Fact(int n)//传参穿过来一个n
//{
//    if (n == 0)
//        return 1;
//    else if (n > 0)
//        return n * Fact(n - 1);//就是n*(n-1)!
//}
//
//
//
//int main()
//{
//    int n = 0;
//    scanf_s("%d", &n);
//    int r = Fact(n);//n的阶乘
//    printf("%d\n",r);
//    return 0;
//}
//当输入数字是5的时候,n传上去的n是5,因为n>0,所以进行n * Fact(n - 1)、
//也就是n*(n-1)!    5*4!
//然后一次进行下去
//到最后,Fact(1)=1*Fact(0),因为Fact(0)=1,所以Fact(1)=1
//Fact(2)=2
//Fact(3)=6
//Fact(4)=24
//Fact(5)=120
//先递推再回归
//假设输入1234
// 1234%10=4
// 1234/10=123
// 123%10=3
// 123/10=12
// 12%10=2
// 12/10=1
// 1%10=1
// 1/10=0
 
//void print(int n)//接收n值
//{
//    if (n > 9)
//        print(n / 10);
//    printf("%d ", n % 10);//打印余数
//}    
//
//int main()
//{
//    int n = 0;
//    scanf_s("%d", &n);
//    print(n);//传过去n值
//
//    return 0;
//}
 
//假设n是123,大于9进去,先用print(123/10),把12的每一位打印出来
//上一步结束后,再打印123%10打印余数3
 
//原理:
//print(1234)
//print(123)+ 4
//print(12)+ 3 4 
//print(1)+2 3 4   ***拆解到这一步然后返回依次打印
//代码的执行顺序是先print,再打印,
//你输入的数据进入print一直被拆分,知道拆分为1时就停止了,
// 然后再依次打印
//先是print(123)
//然后又进入print(123/10)也就是print(12)
//print(12)进去了print(12/10),也就是print(1),
//最后因为1<9,所以就先开始打印了1%10了,
//再返回打印12%10了,然后就是123%10
//最后的结果就是1 2 3
 
//只有print调用完才能轮到printf去打印
//print(1234)分成两部分-- - print(123)和printf("%d", 4)
//print(123)分成两部分---print(12)和printf("%d",3)
//print(12)分成两部分---print(1)和printf("%d",2)

如果函数不返回,函数所对应的栈帧空间就会一直被占用

不使用递归,使用迭代---循环的方式来解决问题

循环一定是迭代,但迭代不一定是循环

//求n的阶乘---循环迭代
int Fact(int n)
{
    int i = 0;
    int ret = 1;
    for ( i = 1; i <= n; i++)
    {
        ret *= i;//就是ret = ret * i
    }
    return ret;
}
 
 
 
 
int main()
{
    int n = 0;
    scanf_s("%d", &n);
    int r = Fact(n);
    printf("%d", r);
 
    return 0;
}

使用迭代的方式去求解,不仅可以解决问题,效率还更高

斐波那契数列

1 1 2 3 5 8 13 21 34 55

当n≤2时,第n个斐波那契数都是1,当n>2时,第n个斐波那契数就可以通过前两个数相加计算

若果求第n个斐波那契数列,用Fib(n)来表示,

当n>2的时候,Fib(n)=Fib(n-1)+Fib(n-2)

//求第n个斐波那契数
//若果求第n个斐波那契数列,用Fib(n)来表示,
//
//当n > 2的时候,Fib(n) = Fib(n - 1) + Fib(n - 2)
int Fib(int n)
{
    if (n <= 2)
        return 1;
    else
        return Fib(n - 1) + Fib(n - 2);
 
 
}
 
 
int main()
{
    int n = 0;
    scanf("%d", &n);
    int r=Fib(n);
    printf("%d\n", r);
 
    return 0;
}

当输入n为50,输出结果十分慢

//循环的方法求出第n个斐波那契数
//1 1 2 3 5 8 13 21 34 55
//求第3个数也就是求2,需要进行一次运算
//求第4个数的时候需要运算两次
//求第五个数的时候要运算3次。
//所以求第n个数的时候,要运算n-2次
 
 
int Fib(int n)
{
 
    int a = 1;
    int b = 1;
    int c = 0;
 
 
 
    //n=1或者n=2的时候,可以不进入循环,n是3的时候大于2,就进去运算
    while (n > 2)//仅仅只有当n>2的时候我们才进行计算
    {
        c = a + b;
        a = b;
        b = c;
        n--;//当n是3的时候—1就是2,就不满足循环的条件
    }//当n是4的=时候,c=1+1=2,然后b就变成下一个运算中的a了,
    //第一个运算的c也变成第二个运算中的b了,然后第四个要求的数就是c了,
    //第一次运算的时候运行了一次n--.所以变成了3,在第二次运行的时候再次
    //运行就变成2了,就停止循环了
    return c;
    //当n=1时,不执行循环,直接返回c
    //当n=2时,不执行循环,直接返回c
}
 
 
 
 
int main()
{
    int n = 0;
    scanf_s("%d", &n);
    int r = Fib(n);
    printf("%d", r);
 
    return 0;
}


目录
相关文章
|
11月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1583 0
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
540 15
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
710 1
一文彻底搞清楚C语言的函数
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
895 16
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
781 3
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
1010 2
|
存储 C语言
C 语言函数完全指南:创建、调用、参数传递、返回值解析
函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。
637 3
|
C语言
C语言---函数---知识点总结(三)------函数的返回值类型
C语言---函数---知识点总结(三)------函数的返回值类型
|
C语言
C语言函数返回值详解
本文详细解析了C语言中函数返回值的概念与应用。从函数的基本定义入手,深入探讨了不同类型返回值的作用及意义,并提供了实用的编程示例,帮助读者更好地理解和使用函数返回值。通过本文,你将掌握如何有效利用返回值优化代码结构与功能实现。
1794 2
|
C语言
C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数,若为素数函数返回值为1,否则为0。在主函数中输入一个整数x,调用函数isprime(x)来判断这个整数x是
C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数,若为素数函数返回值为1,否则为0。在主函数中输入一个整数x,调用函数isprime(x)来判断这个整数x是
1267 0
C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数,若为素数函数返回值为1,否则为0。在主函数中输入一个整数x,调用函数isprime(x)来判断这个整数x是