C语言04-函数递归(上)

简介: C语言04-函数递归(上)

什么是递归?


程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。



递归的好处是什么?

递归的两个必要条件

1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。

2.每次递归调用之后越来越接近这个限制条件




递归的重要性

递归是一个很强的描述工具,不是算法。唯一的作用就是辅助你的思维,比如有时候从递归的角度很
容易构造递推式。至于现有语言的语法上能否高效率的支持递归不是核心问题。
数据结构中的二叉树的很多接口都是用到递归思维
复制代码


什么时候使用递归?

1.当解决一个问题时,递归和非递归都可以使用,且没有明显问题,就使用递归


2.当解决一个问题递归写起来很简答,非递归写起来比较复杂,且递归没有明显问题,那就用递归。


3.如果说用递归解决问题,写起来简单,但是有明显问题,那就不能用递归,要用非递归方式解决


注意:递归不能无限递归下去,否则会造成死循环和栈溢出


习题练习:

多说无益,实践是检验真理的唯一标准!下面我们就使用递归和非递归的方式来看看每个题怎么写吧!



1.用递归的方式顺序打印一个数的每一位

image.png

//1.用递归的方式顺序打印一个数的每一位
当n为两位数时还要进行拆分,所以if判断条件为n>9
Print(1234)
Print(123)
Print(12)  
Print(1) 
//
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;
}
复制代码


运行结果:image.png


2.用递归的方式逆序打印一个数

image.png


void Print(int n)
{
  if (n > 0)
  {
    printf("%d ", n % 10);
    n /= 10;
    //n%10:得到最后一位数字
    //n/10 :除掉最后一位数字
    Print(n);
  }
  else
    return;
}
int main()
{
  int n = 0;
  //输入要打印的数
  scanf("%d", &n);
  Print(n);
  return 0;
}
复制代码

运行结果:image.png


3.用非递归的方式求阶乘

阶乘: n! = 123...n      如 :3!=321=6**


阶乘是什么:

阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。
一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。
复制代码
//用递归+非递归的方式求阶乘
// //注意:负数没有阶乘。
//阶乘是指从1到n的连续自然数相乘的积。符号为:n!
// 所以我人为规定,输入为负数时,输出1
//非递归
复制代码
int Fac1(int n)
{
  int i = 0;
  int sum = 1;//注意sum不可以初始化为0,因为0乘任何数都为0
  //i也不可以从0开始 0*任何数字都为0
  for (i = 1; i <= n; i++)
  {
    sum *= i;
  }
  return sum;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int ret = Fac1(n);
  printf("%d\n", ret);
  return 0;
}
复制代码


4.用递归的方式求阶乘

image.png


根据上述图解就可以写出代码了!


//递归方式
int Fac2(int  n)
{
  return n < 1 ? 1 : Fac2(n - 1) * n;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int rett = Fac2(n);
  printf("%d\n", rett);
  return 0;
}


相关文章
|
18天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
3天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
11 2
|
7天前
|
C语言
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
9 0
|
12天前
|
缓存 安全 编译器
【C 言专栏】C 语言函数的高效编程技巧
【5月更文挑战第1天】本文探讨了C语言中函数的高效编程技巧,包括函数的定义与作用(如代码复用和提高可读性)、设计原则(单一职责和接口简洁)、参数传递方式(值传递、指针传递和引用传递)、返回值管理、调用约定、嵌套与递归调用,以及函数优化技巧和常见错误避免。掌握这些技巧能提升C语言代码的质量和效率。
【C 言专栏】C 语言函数的高效编程技巧
|
14天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
14天前
|
C语言
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
pta 浙大版《C语言程序设计(第3版)》题目集 习题6-6 使用函数输出一个整数的逆序数 (20分)
|
14天前
|
C语言
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
(浙大版《C语言程序设计(第3版)》 习题6-5 使用函数验证哥德巴赫猜想 (20分)
|
16天前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
5 0
|
16天前
|
C语言
【C语言】字符分类函数与字符转换函数
【C语言】字符分类函数与字符转换函数
10 1
|
16天前
|
程序员 编译器 C语言
C语言之函数与参数
C语言之函数与参数
8 0