函数的递归调用,局部变量与全局变量

一、函数的递归调用

递归函数:自身调用自身的操作。递归函数一定要有结束条件,否则会产生死循环。

题目:n的阶乘的递归调用实现。

假设有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?(3种走法:第一种为每次上1个台阶,上3次;第二种为先上2个台阶,再上一个台阶;第三种为先上1个台阶,再上2个台阶。)

//  Created by Lee Lucy on 2024/2/29.

#include <stdio.h>

//求n的阶乘
int f(int n)
{
    //一定要求结束条件,一定是在return之前
    if(1==n)
    {
        return 1;
    }
    return n*f(n-1);//写公式
}

//上台阶,到第n个台阶,有多少种走法
int step(int n)
{
    if(1==n||2==n)//当台阶是1个,或者2个时,递归结束
    {
        return n;
    }
    return step(n-1)+step(n-2);
}
int main(int argc, const char * argv[]) {
    int n;
    scanf("%d",&n);
//    printf("f(%d)=%d\n",n,f(n));
    printf("step(%d)=%d\n",n,step(n));
    return 0;
}

二、全局变量解析-形参-实参解析

在不同的函数之间传递数据时,可以使用的方法如下:

(1)参数:通过形式参数和实际参数。

(2)返回值:用return语句返回计算结果。

(3)全局变量:外部变量。

全局变量存储在哪里?

全局变量i存储在数据段,所以main函数和print函数都是可见的,全局变量不会因为某个函数执行结束而消失,在整个进程的执行过程中始终有效,因此工作中应尽量避免使用全局变量。

前几章定义的变量称为全局变量,局部变量存储在自己的函数对应的栈空间内,函数执行结束后,函数内的局部变量所分配的空间将会得到释放。如果局部变量与全局变量重名,将采取就近原则,即实际获取和修改的值时局部变量的值

练习:如果把print(int a)改为print(int i),那么print函数的打印结果是什么?

关于形参和实参的说明:

(1)定义函数中指定的形参,如果没有函数调用,那么并不占用内存中的存储单元,只有发生函数调用时,函数print中的形参才会被分配内存单元。在调用结束后,形参所占用的内存单元也会被释放。

(2)实参可以是常量、变量或表达式,但要求有确定的值。例如,print(i+3)在调用时将实参的值i+3赋给形参,print函数可以有两个形参,如print(int a,int b)

(3)在被定义的函数中,必须指定形参的类型。如果实参列表中包含多个实参,那么各参数间用逗号隔开,实参与形参的个数应相等,类型应匹配,且实参与形参应按顺序对应,一一传递数据。

(4)实参与形参的类型应相同或赋值应兼容。

(5)实参向形参的数据传递是单向“值传递”,只能由实参传给形参,而不能由形参传回给实参。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。

(6)形参相当于局部变量,不能再定义局部变量与形参同名,否则会造成编译不通。

三、局部变量与全局变量

1.内部变量

在一个函数内部定义的变量称为内部变量。只在本函数范围内有效,即只有在本函数内才能使用这些变量,也称局部变量。

关于局部变量需要注意的几点:

(1)主函数中定义的变量只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效,主函数也不能使用其他函数中定义的变量。

(2)不同函数中可以使用相同名字的变量,代表不同的对象,互不干扰。

(3)形式参数也是局部变量。

(4)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句称为“分程序”或“程序块”。上例中的int j=5就是如此,只在离自己最近的花括号内内有效,若离开花括号,则在其下面使用该变量会造成编译不通

(5)注意细节:for循环的小括号内定义的int i,在离开for循环后,是不可以再次使用的。

2.外部变量

函数之外定义的变量称为外部变量。外部变量可以为本文件中的其他函数共用,有效范围是从定义变量的位置开始到本源文件结束,所以也称全程变量。

关于全局变量需要注意的几点:

(1)全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。

(2)使用全局变量过多会降低程序的清晰性。在各个函数执行时都可能改变外部变量的值,程序容易出错,因此要有限制地使用全局变量(初试时尽量不用)。

(3)因为函数在执行时依赖于其所在的外部变量,如果将一个函数移到另一个文件中,那么还要将有关的外部变量及其值一起移过去。然而,如果该外部变量与其他文件的变量同名,会出现问题,降低程序的可靠性和通用性。C语言一般要求把程序中的函数做成一个封闭体,除可以通过实参——形参的渠道与外界发生联系外,没有其他渠道。

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LucyLee04

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值