函数进阶 — 递归
标签: C语言
学习人数: 14.6k


高清播放
赞赏支持

题目

求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。

题目链接:http://www.noobdream.com/DreamJudge/Issue/page/1044/

新知识点:

作用域规则

任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:

  1. 在函数或块内部的局部变量
  2. 在所有函数外部的全局变量
  3. 形式参数的函数参数定义中

让我们来看看什么是局部变量、全局变量和形式参数。

局部变量

在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。在这里,所有的变量 a、b 和 c 是 main() 函数的局部变量。

#include <stdio.h>
 
int main () {
  /* 局部变量声明 */
  int a, b;
  int c;
  /* 实际初始化 */
  a = 10;
  b = 20;
  c = a + b;
  printf ("value of a = %d, b = %d and c = %d\n", a, b, c);
  return 0;
}

全局变量

全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。

全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。下面是使用全局变量和局部变量的实例:

#include <stdio.h>
 
/* 全局变量声明 */
int g;
int main () {
  /* 局部变量声明 */
  int a, b;
  /* 实际初始化 */
  a = 10;
  b = 20;
  g = a + b;
  printf ("value of a = %d, b = %d and g = %d\n", a, b, g);
  return 0;
}

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用。

形式参数

函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用。

初始化局部变量和全局变量

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动对其初始化。

正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。

递归

递归指的是在函数的定义中使用函数自身的方法。

void recursion() {
    statements;
    ... ... ...
    recursion(); /* 函数调用自身 */
    ... ... ...
}
int main() {
    recursion();
}

题目解析虽然前面的章节我们做过这道题目,但是我们要用递归来解决这个问题,计算阶乘的过程其实我们就可以用递归来实现。

参考代码

#include <stdio.h&...
登录查看完整内容


课后作业

1、请完成下面这道题目,检验一下自己是否学会了本节的内容。

传送门:点击这里


登录后开始许愿

3 条上岸许愿
ljx1234567890
2024年11月14日 20:21

#include "stdio.h"
#include <stdbool.h>
#include <time.h>
#include <string.h>
int C(int n,int r){
if(r==0)
    return 1;
else
   return C(n,r-1)*(n-r+1)/r;}

int main()
{
   int a,b;
   while(scanf("%d%d",&a,&b)!=EOF){
    if(a==0 && b==0)
        break;
    else if (a==0 || a<=b) printf("error!");
    else printf("%d",C(a,b));

   }

       return 0;
}

哪里有问题了啊

赞(0)
ljx1234567890
2024年11月14日 20:21

#include "stdio.h"
#include <stdbool.h>
#include <time.h>
#include <string.h>
int C(int n,int r){
if(r==0)
    return 1;
else
   return C(n,r-1)*(n-r+1)/r;}

int main()
{
   int a,b;
   while(scanf("%d%d",&a,&b)!=EOF){
    if(a==0 && b==0)
        break;
    else if (a==0 || a<=b) printf("error!");
    else printf("%d",C(a,b));

   }

       return 0;
}

哪里有问题了啊

赞(0)
六爷
2022年3月22日 19:39

递归会超时,建议换一道题。

赞(0)

admin 回复 六爷: 感谢提醒,已更换

2022年6月25日 11:51