函数的递归和迭代

    选择打赏方式

函数的递归和迭代

  • 意义 ;某些功能可以通过函数自己调用自己的方式来实现,从而大大的减少了代码量
    求n的阶乘可以使用递归的方法来实现
  • 通过函数递归的方式求第n个斐波那契数
//求第n个斐波那契数
# include<stdio.h>
int fib(int n);
int main()
{
    int n = 0;
    scanf("%d",&n);
    //TDD 驱动开发
    int ret =fib(n);
    printf("第n个斐波那契数为:%d",ret);
    return 0;
}
int fib(int n)
{
    if(n<=2)
    {
        return 1;
    }
    else
    {
        int a = (fib(n-1)+fib(n-2));
        return a;
    }
}
//递归重复计算次数太多,效率低下 

迭代

  • 通过循环的方式求第n个斐波那契数
# include<stdio.h>
int fid(int n);
int main()
{
    int  n = 0;
    do
    {
    printf("请输入需要求的斐波那契数:");
    scanf("%d",&n);
    if(n>=1)
    {
        long long  ret = fid(n);
        printf("第%d个斐波那契数为:%lld",n,ret);
    }
    else
    {
    printf("输入错误请重新输入");
    }
    }
    while(n<1);
    return 0;
}
int fid(int n)
{
    int a = 1;
    int b = 2;
    int c = 1;
    while(n>2)
    {
        c = a+b;
        a = b;
        b = c;
        n--;
    }
    return c;
} 

函数的递归,大事化小的过程

常见的错误,stack overflow:栈溢出,内存被占完

递归在书写的过程中应该注意的条件

  • 基准情形:必须有某些基准的情形,他们不使用递归就能够求解
  • 不断推进:对于那些需要递归求解的情形,递归调用必须能够朝着产生基准情形的方向推进
  • 设计法则:假设所有的递归调用都能运行
  • 合成效益法则:在求解一个问题的同一实列时,切勿在不同的递归调用中重复一项工作(这样会产生很多不必要的计算,比如用递归求解第n个斐波那契数)

练习题

  1. 模拟实现strlen函数
int my_strlen(char* n)
{
    int count = 0;
    while(*n !='\0')
    {
        count++;
        n++;
    }
    return count;
}
# include<stdio.h>
int main()
{
    char arr[] = "bit";
    // scanf("%c",&arr);
    int len = my_strlen(arr);
    printf("len= %d",len);
    return 0;
} 
  1. 用递归的方式实现输入123,输出1,2,3
# include<stdio.h>
void print(int n)
{
    if(n>9)
    print(n/10);
    printf("%d ",n%10);
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    print(n);
    return 0;
} 

SP`K71[S_T%G86J~{WGWN}3.png

  1. 编写函数不能创建临时变量,模拟实现strlen(递归)
# include<stdio.h>
int my_strlen(char* arr)
{
    if(*arr !='\0')
    {
        return 1+my_strlen(arr+1);
    }
    return 0;
}
int main()
{
    char arr[] = "school";
    int len = my_strlen(arr);
    printf("len = %d",len);
    return 0;
} 
版权声明:若无特殊注明,本文为《若离风》原创,转载请保留文章出处。
本文链接:https://www.rlfit.cn/post-24.html
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框
可使用QQ号实时获取昵称+头像

私密评论

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!