首页 > 其他分享 >C语言学习记录---函数3

C语言学习记录---函数3

时间:2023-09-23 22:31:42浏览次数:27  
标签:Fib return 函数 递归 int C语言 --- result printf

声明

#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

7.3 递归与迭代

7.3.1 练习3:

求n的阶乘。(不考虑溢出)

参考代码:


int Facl(int n)
{
    if(n > 1)
    {
        return n = n *Facl(n-1);
    }
    else
    {
        return 1;
    }

}

int main()
{
    int n = 0;
    int ret = 0;
    printf("请输入n的值>:");
    scanf("%d",&n);
    ret = Facl(n);
    printf("%d\n",ret);
    return 0;

}

//
int Facl(int n)
{
    int i = 0;
    int ret = 1;
    for(i = 1;i<=n;i++)
    {
        ret *= i;
    }
    return ret;
}
int main()
{
    int n = 0;
    int ret = 0;
    printf("请输入n的值>:");
    scanf("%d",&n);
    ret = Facl(n);
    printf("%d\n",ret);
    return 0;

}

7.3.2 练习4:

求第n个斐波那契数。(不考虑溢出)

参考代码:

int Fib(int n)
{
    if(n >2)
    {
        return n = Fib(n-1)+Fib(n - 2);
    }
    else
    {
        return 1;
    }
}


int main()
{
    int n = 0;
    printf("你想知道第几个斐波那契数>:");
    scanf("%d",&n);
    int fib = Fib(n);
    printf("%d",fib);
    return 0;
}





这种方法计算量大,多加两行代码测第三个斐波那契数的个数,
当n足够大时,仅是第三个斐波那契数的计算次数就非常大;
所以这里用递归不合适
int count = 0;
int Fib(int n)
{
    if(n ==3)
    {
        count ++;
    }
    if(n >2)
    {
        return n = Fib(n-1)+Fib(n - 2);
    }
    else
    {
        return 1;
    }
}

int main()
{
    int n = 0;
    printf("你想知道第几个斐波那契数>:");
    scanf("%d",&n);
    int fib = Fib(n);
    printf("%d",fib);
    printf("count = %d",count);
    return 0;
}

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

int main() {
    int n = 0;
    printf("你想知道第几个斐波那契数>:");
    scanf("%ld", &n);
    int fib = Fib(n);
    printf("%ld", fib);
    return 0;
}
//但当n比较大时,因为数字比较大,会出现溢出

在调试函数的时候,如果你的参数比较大,那就会报错: stack overflow(栈溢出)这样的信息。

系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一 直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出

那如何解决上述的问题:

1. 将递归改写成非递归。

  1. 使用static对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 static 对象替代nonstatic 局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保存递归调用的中间状态,并且可为各个调用层所访问
//求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;
}

提示:

1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。

2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。

3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开

销。

标签:Fib,return,函数,递归,int,C语言,---,result,printf
From: https://blog.51cto.com/u_16251486/7581448

相关文章

  • (base) [root@pc1 test01]# conda create -n py37 python=3.7
     001、问题:conda创建python环境遇到如下问题:Collectingpackagemetadata(current_repodata.json):|DEBUG:urllib3.connectionpool:StartingnewHTTPSconnection(1):repo.anaconda.com:443 002、解决方法: ......
  • stat函数详解
    Linux系统函数之文件系统管理stat函数作用:获取文件信息include<sys/types.h>#include<sys/stat.h>#include<unistd.h>函数原型intstat(constchar*path,structstat*buf)返回值:成功返回0,失败返回-1;参数:文件路径(名),structstat类型的结构体structstat结构体详......
  • Postman 中 Pre-request Script 加密脚本 CryptoJS-AES-ECB-128
    参考链接:http://jser.io/2014/08/19/how-to-use-aes-in-crypto-js-to-encrypt-and-decryptAug19,2014 //明文test_Str=`{"pageNo":1,"pageSize":15}` constplaintText=test_Str;constkeyStr='3333333333333333';//一般key为一个字......
  • Hive的使用以及如何利用echarts实现可视化在前端页面展示(四)---连接idea使用echarts
    说来惭愧,我的javaweb烂得一批,其他步骤我还是很顺利地,这个最简单的,我遇到了一系列问题。只能说,有时候失败也是一种成功吧这一步其实就是正常的jdbc,没什么可说明的,但是关于使用echarts我还是遇到了一些困难,如果有高手能指正一二,感激不尽echarts获取前端数据要使用Ajax,我不会这个语......
  • Hive的使用以及如何利用echarts实现可视化在前端页面展示(三)---hive数据利用sqoop导
    1、安装sqoop我的版本jdk1.8hadoop3.1.3sqoop1.4.6基本上就安装这个版本都没问题,如果是执行连接数据库命令时报错:java.lang.NoClassDefFoundError;报错,在lib下再放一个commons-lang-2.6.jar即可,sqoop安装:Indexof/dist/sqoop(apache.org)commons-lang-2.6.jar下载:commo......
  • MQ - 04 基础篇_存储_消息数据和元数据的存储设计
    @[toc]![在这里插入图片描述](https://img-blog.csdnimg.cn/855d3c6d2ef74a1893f352a4545b479c.png)---------------------#导图![在这里插入图片描述](https://img-blog.csdnimg.cn/d0569e3871dd433784f74d76ebee9a9d.png)----------#概述消息数据和元数据的存......
  • 微信小程序自定义tabbar遮挡scroll-view问题
    在使用小程序开发时,底部为自定义导航栏,在使用scroll-view滚动页面时,滚动到底部时最后一条或多条数据被导航栏遮挡,如下:解决方案:1.获取用户手机宽度和高度letdeviceWidth=wx.getSystemInfoSync().windowWidth;//获取屏幕宽度letdeviceHeight=wx.getSystemInfoSync().win......
  • Hive的使用以及如何利用echarts实现可视化在前端页面展示(二)---hive部分的实现
    1、利用远程连接器上传csv文件2、进入hive创建表结构:创建一个Hive表的SQL语句:这个表名为 "sales",包含了五个列:day_id、sale_nbr、buy_nbr、cnt 和 round。此表的数据格式为逗号分隔的文本文件,每一行都用逗号分隔字段。createtablesales(day_idstring,sale_nbrstring,b......
  • 第06章-基于TPC-DS进行性能测试
    目录第06章基于TPC-DS进行性能测试26.1搭建TPC-DS环境26.1.1下载项目26.1.2准备JAVA编译环境26.1.3准备本地编译环境26.1.4编译项目46.1.5生产测试数据和表46.2进行TPC-DS测试56.2.1编写提交脚本56.2.2运行脚本进行TPC-DS测试66.35T数据规模下SPARK2/SPARK3性......
  • C语言char类型的存储
    (目录)char是如何存储的字符型(char)用于储存字符(character),如英文字母或标点。但是char类型在内存中并不是以字符的形式储存,而是以ASII码的形式储存,也可以说char类型储存的实际上是整数。所以char类型也被归类为整形家族。intmain(){ charc='A'; printf("%d\n",c); print......