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

慈云数据 2024-05-11 技术支持 53 0

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

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

C语言--函数递归与迭代
(图片来源网络,侵删)

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

递归的思想:

把大事化小事

C语言--函数递归与迭代
(图片来源网络,侵删)

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

//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),
//最后因为12的时候,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)//仅仅只有当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;
}
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon