Linux C语言高级学习第五天(递归&指针)

递归:

函数允许自己调用自己

5号:4号+2岁;

4号:3号+2岁;

……

1号:10岁。

#include<stdio.h>
//age(n)=age(n-1)+2;(n>=2)
//age(n)=10;(n=1)
int age(int n)
    {
        if(n==1)
            return 10;
        else
            return age(n-1)+2;
    }
int main()
{
    int a,sum;
    scanf("%d",&a);
    sum = age(a);
    printf("%d\n",sum);
    return 0;
}

这就称为递归

原理:

相较于同等循环的缺点:占用空间大

递归的优点:

1.比同等逻辑的循环速度更快

2.某些时候高级算法必须使用递归实现

 

定理:任意一个递归算法都可以转换为等价的非递归算法(需要栈辅助)

递归的实现:

1.两大要素:

1)递归逻辑:让递归函数持续运行的逻辑-->递

如:return age(n-1)+2;

2)递归出口:让递归函数停止运行开始返回的条件-->归

如:if(n==1) return 10;

使用递归函数时,需要设置正确的递归逻辑和递归出口。一旦二者设置完毕,递归函数可以自动运行无需人为干预。

#include<stdio.h>
//练习2.用递归的方法求n阶勒让徳多项式的值,递归公式为;
//Pn(x)=1;(n=0)
//Pn(x)=x;(n=1)
//Pn(x)=((2n-1)*x - Pn-1(x) - (n-1)*Pn-2(x))/n;(n>1)
float legender(float x,int n)
{
    if(n==0)
        return 1;
    else if(n==1)
        return x;
    else
        return ((2*n-1)*x-legender(x,n-1)-(n-1)*legender(x,n-2))/n;
}
int main()
{
    float x;
    int n;
    printf("请输入x的值:");
    scanf("%f",&x);
    printf("请输入n的值:");
    scanf("%d",&n);
    printf("勒让德多项式的值是%f\n",legender(x,n));
    return 0;
}

移动n个圆盘

递归逻辑:

1.将n-1个圆盘从A借助C移动到B

2.将第n个圆盘从A移动到C

3.将n-1个圆盘从B借助A移动到C

递归出口:

将第1个圆盘从A移动到C

#include<stdio.h>
int i=0;//记录移动次数
int hanoi(int n,char jia,char yi,char bing)
{
    if(n==1)
    {
        printf("%c-->%c\n",jia,bing);//只有1个,A-->C
        i++;
        printf("这是第%d次\n",i);
    }
    if(n>1)//超过一个时
    {
        hanoi(n-1,jia,bing,yi);//A上最低盘之上的,要借助C移动到B上
        printf("%c-->%c\n",jia,bing);//A上最低盘之上的再A-->C
        i++;
        printf("这是第%d次\n",i);
        hanoi(n-1,yi,jia,bing);//B剩余的再借助A移动到C上
    }//共计交换(2^n - 1)次
   return i;
}
int main()
{
    int n,sum;;
    char x,y,z;
    x = 'A';
    y = 'B';
    z = 'C';
    printf("请输入有多少个圆盘:");
    scanf("%d",&n);
    sum = hanoi(n,x,y,z);
    printf("总计:%d次\n",sum);
    return 0;
}

作业:证明n阶Hanoi塔需要2^n-1步

提示:数学归纳法

 

static变量和extern变量

♕static静态

1.定义一个静态局部变量

1)静态局部变量默认初值为  0 ;

2)静态局部变量只会被初始化一次;

3)当再次调用该函数时,静态局部变量会继承上一次的值。

PS:静态局部变量 和 全局变量,在内存中存在同一块区域

 

2.定义静态全局变量

静态全局变量只允许本文件的函数访问,不允许其他文件的函数访问

3.定义内部函数

内部函数只允许被本文件的其他函数调用,不允许被其他文件的函数调用

//当初设计2、3两种用法的初衷是增加数据的保密性。

extern外部

1.扩展全局变量的作用范围

 

※extern扩展全局变量作用范围并非变量定义,而是变量声明

声明<==?==>定义

声明可以声明很多次,但是定义只能有一次!

变量声明并没有占用空间,变量的定义才开始占用空间

结构体::就是先声明-->定义-->使用

数据类型:构造数据类型里只有数组不需要声明

构造数据:从无到有;从小到大。

 

2.将全局变量作用范围扩展至其他文件

3.定义外部函数

头文件(最后一天课讲授)

//隐藏Boss:回调函数(70级副本)


指针:

1.指针与地址

 

地址:存储单元的基本单位(字节)在内存中的唯一编码。

首地址:如果一个变量横跨多个存储单元,为了寻址方便,将编号最小的地址选定为该变量的代表地址。

 

指针:Jeef Dean编程贼拉流批,编译器都不敢给他报错

    存储和操作地址的变量

数组名代表数组的首地址,首地址不能变化,因此首地址是常量--->

因此地址是常量,不能直接进行运算,需要引用指针进行操作就像是:

3++;错误,但是:a = 3;a ++;就可以进行操作

※地址是常量,但是指针是变量。

为什么:int *p; 和 int* p;都能定义一个指针,而要以第一种为标准

因为:当定义两个变量时:int *p,q;  而  int* p,q;容易让人误解为两个指针;实际时p是指针,而q是int变量。

指针的指向:指针变量内存的地址

指针指向的对象:指指针内 存储的地址的值

指针的指针-->二级指针(指向指针的指针)

2.指针的大小与指针的运算

指针的大小:

1)与指针指向的对象的数据类型无关,无论指针指向何种数据,指针的大小都是32位4字节。

2)指针可以通过强制类型转换指向任意数据类型。

 

指针的运算:

1)指针只有一种运算:偏移运算;

2)减:表示向低地址方向偏移;加表示向高地址方向偏移,每次偏移量大小由指针指向的对象类型决定

为什么指针一定要分类型?就是因为在运算的时候会出现问题。

字节序:大端序与小端序

大端序:数据高位对应存储低位,数据低位对应存储高位

    主要用于网络通信

小端序:数据高位对应存储高位,数据低位对应存储低位

    主要用于操作系统

PS:操作系统和路由器就负责大端序和小端序的转换

Linux C语言高级学习第五天(递归&指针)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值