递归的学习和归类

把一个大型的复杂问题,层层化为内容相似的规模较小的问题来求解,这就是递归的思路。

问题一:输入一个int型数,如:2022,输出2 0 2 2

很显然这里需要重复进行:t=n%10;n=n/10;printf("%d",t);不过需要第一个输出整数的最高位,刚好递归可以很方便的做到。

#include <stdio.h>

int main()
{
    int numb;
    void new_print(int n);
    scanf("%d",&numb);
    new_print(numb);
    return 0;
}

void new_print(int n)
{
    if(n>10)
    {
        print(n/10);
    }
    printf("%d ",n%10);
}

问题二: 不用创建参数,测试字符串的长度

int main()
{
    char str1[]="struggle up!!!";
    printf("%d\n",strlen(str1));
}

或者,用上函数的递归和指针,如下:

int my_strlen(char* str)
{
    if(*str!='\0')
    {
        return 1+my_strlen(str+1);
    }
}

int main()
{
    char str1[]="struggle up!!!";
    printf("%d\n",my_strlen(str1));
    return 0;
}

问题三:输入一个数,求阶乘

int factorial(int n)
{
    if(n>1)
    return n*factorial(--n);
}

int main()
{
    int n=0;
    scanf("%d",&n);
    printf("%d",factorial(n));
    return 0;
}

问题四:斐波那契数,这到题要注意了,因为面试,笔试,很可能会出现,还有这个问题用递归存在的问题。

int count=0;

int  fibonacci(int n)
{
    int a=1;
    int b=1;
    if(3==n)
    {
        count++;
    }
    if(n<=2)
    {
        return 1;
    }
    else
    return fibonacci(n-1)+fibonacci(n-2);

}

int main()
{
    int n=0;
    scanf("%d",&n);
    printf("%d\n",fibonacci(n));
    printf("%d\n",count);
    return 0;
}
40
102334155
39088169

很显然,在这道题中,重复计算了39088169次fibonacci(3),这对资源是十分浪费的!!!

可以用循环来优化它。

int  fibonacci(int n)
{
    int a=1;
    int b=1;
    int c=1;
    while(n>2)
    {
        c=a+b;
        a=b;
        b=c;
        n--;
    }
    return c;
}

第五题:汉诺塔问题,这道题也很有可能会考

第六题:青蛙跳台问题,

这个问题和斐波那契数列差不多,先用数学把数列总结下来!

这里就不列举了

void hannuo(int n,char a,char b,char c)
{
    if(n==1)
        printf("\t%c->%c\n",a,c);    //当n只有1个的时候直接从a移动到c 
    else
    {   
        hannuo(n-1,a,c,b);            //a的n-1个盘子通过c移动到b 
        printf("\t%c->%c\n",a,c);   //a的最后1个盘(最大的盘)移动到c 
        hannuo(n-1,b,a,c);            //b上面的n-1个盘通过a移动到c 
    }  
} 
int main()
{
    int n=0;
    scanf("%d",&n);
    hannuo(n,'A','B','C');
    return 0;
}

总的来所,递归问题是用来锻炼思维的,它十很可能造成栈溢出,学习了解就好。

下一篇文章,回来学习冒泡排序,和选择排序的优化问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值