函数递归(详细解读)(上)

简介: 函数递归(详细解读)(上)

什么是递归


程序调用自身的编程技巧称为递归( recursion)。(既函数自己调用自己)

递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接

调用自身的

一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小(大事化小)的问题来求解,

递归策略

只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的主要思考方式在于:把大事化小

例子:

#include<stdio.h>
int main()
{
  printf("hehe\n");
  main();
  return 0;
}

0e5d30128bd949d19129c6058af0ea89.png

d2f3e26ccb3446408195b3caeec1b59b.png

ba75fa78789744f487d256c0f067eb37.png

每一次函数调用,都要在栈区申请一块空间,main()函数内调用main()函数, 又会申请空间,会把栈区耗干,程序崩溃,栈溢出。


例题1


接受一个整型值(无符号),按照顺序打印它的每一位。 例如: 输入:1234,输出 1 2 3 4.

思路:

1234

1234%10=4

             👇

1234/10=123

123%10=3

           👇

123/10=12

12%10=2

         👇

12/10=1

1%10=1

输入的这个数每一次%10就可以得到次数末位数字,这样就可以打印出4321,但题目要求的是正序打印即1 2 3 4

可以分析一下:

Print(1234)%10就可以得到4

Print(123) 4 -->先把123的每一位打印出来,再打印4,按照这样的思路,可以抽丝剥茧,把大的问题转化成细致的问题,一层一层往下剥,把一个大问题逐层逐层地转化成小问题

Print(12) 3 4 --> Print(1) 2 3 4

当这个函数只剩一位数时就不需要拆了,两位数以上才需要拆

void Print(unsigned int n)
{
  if (n > 9)
  {
    Print(n / 10);
  }
  printf("%d ", n % 10);
}
int main()
{
  unsigned int num = 0;
  scanf("%u", &num);
  Print(num);
  return 0;
}

print("%d ",n%10); 也可以用%u

%u - 无符号的整数

%d - 有符号的整数


代码运行:

632406d88d624bcfa3626c3f618ce404.png

图解:

aa72b253e69949989ca5895b04c321ae.png

回到这个代码

void Print(unsigned int n)

{

   if (n > 9)

   {

       Print(n / 10);

   }

   printf("%d ", n % 10);

}

如果上述代码没有/10操作,就会出现死递归,永远递归下去,所以递归要满足条件


递归的两个必要条件

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

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


例题2

2.1使用strlen函数,求字符串的长度

以下使用函数的时候必须要引用库函数#include<string.h>,strlen统计的是'\0'之前出现的字符的个数

#include<stdio.h>
#include<string.h>
int main()
{
  char arr[10] = "abc";
  int len1 = strlen(arr); 
  printf("%d\n", len1);
  /*int len2 = my_strlen(arr);
  printf("%d\n", len2);*/
  return 0;
}


代码运行:

2c3e6633eb5f478a913d5f41b0e36e7e.png

2.2编写函数,求字符串的长度

数组名是数组首元素的地址,当arr作为 my_strlen()的参数,传到函数内,创建指针变量char *str,代表字符串第一个字符的地址即为a的地址,创建计数器cnt,只要指针str指向的字符不是'\0',cnt++,str++.

int my_strlen(char* str)
{
  int count = 0;
  while (*str != '\0')
  {
    count++;
    str++;
  }
  return count;
}
#include<stdio.h>
int main()
{
  char arr[10] = "abc";
  int len = my_strlen(arr);
  printf("%d\n", len);
  return 0;
}


 代码运行:

a59db113948a482fae3f94bbf8ba2621.png

相关文章
|
7月前
函数递归(详细解读)(下)
函数递归(详细解读)(下)
|
7月前
|
编译器
【函数和函数递归】
【函数和函数递归】
37 0
|
2月前
|
算法 Java C语言
C语言函数的递归
C语言函数的递归
9 0
|
4月前
|
机器学习/深度学习 编译器 C语言
关于函数递归的基础
关于函数递归的基础
33 5
|
8月前
|
算法 C语言
C语言函数递归练习详解
C语言函数递归练习详解
|
10月前
|
算法 C语言
函数的递归
当我们在生活中遇到一个复杂问题时,我们会想方设法将其解决,这时我们会有很多种方法,我们可以将问题一步一步顺序化,也可以使用逆向思维将其巧妙化解。C语言中就给我们提供了一种将问题大事化小思想——递归。
52 0
|
10月前
|
存储 算法 C++
递归的应用
递归的应用
|
11月前
|
Java 数据安全/隐私保护 决策智能
字符串全排列(递归)
字符串全排列,递归的应用
112 0
|
11月前
|
算法 程序员 编译器
C语言函数与递归
C语言函数与递归
90 0
|
算法
【学习笔记之我要C】函数递归
【学习笔记之我要C】函数递归
41 0