当前位置:网站首页>5.函数递归练习
5.函数递归练习
2022-07-06 09:19:00 【是王久久阿】
目录
TEXT 1 递归方式实现打印一个整数的每一位
例如:124,按照顺序打印1 2 4。
思路:
例如:设置一个函数print,打印124的每一位。将124拆分为print(12)和单独打印4;再将12拆分成print(1)和单独打印2;print(1)时,判断1是个位数,停止递归,直接打印1。
#include<stdio.h>
void print(int x)
{
if (x / 10 != 0)
{
print(x / 10);
}
printf("%d ", x % 10);
}
int main()
{
int a = 124;
print(a);
return 0;
}
TEXT 2 逆序打印整数的每一位
例如:124,逆序打印4 2 1。
思路:
在递归前实现打印,即可完成逆序打印。
#include<stdio.h>
void print(int a)
{
if (a / 10 != 0)
{
printf("%d ", a % 10);
print(a / 10);
}
else
printf("%d ", a);
}
int main()
{
int a = 124;
print(a);
return 0;
}
TEXT 3 递归求n(n≥1)的阶乘(不考虑溢出的问题)
思路:
例如:4!拆分为:求3!和*4;3!拆分为:2!和*3;2!拆分为1!和*2;当n=1时,停止递归。
#include<stdio.h>
int fac(unsigned int n)
{
int sum = 1;
if (n > 1)
{
sum=fac(n - 1);
}
sum *= n;
return sum ;
}
int main()
{
unsigned int n = 0;
scanf("%d", &n);
printf("%u\n", fac(n));
return 0;
}
TEXT 4 strlen的模拟(递归实现)
strlen可以求字符串的长度,其结果不包含终止符‘\0’。创建一个函数,模拟strlen的功能。
思路:
我们设置一个函数模拟strlen时,当字符串读取到‘\0’时,迭代结束。
例如:求字符串“abc”的长度,可以拆分为:1+字符串“bc”的长度;求字符串“bc”的长度拆分为:1+求字符串“c”的长度;求字符串“c”的长度拆分为:1+‘\0’;遇到‘\0’停止递归。
#include<stdio.h>
int my_strlen(char* arr)
{
if (*arr != '\0')
{
return 1+my_strlen(arr + 1);
}
}
int main()
{
char arr[] = "abcdef";
printf("%d\n", my_strlen(arr));
return 0;
}
TEXT 5 字符串逆序(递归实现)
编写一个函数 reverse_string(char * string)(递归实现)//只能传一个参数
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
思路:
逆序字符串,可以理解为将第1个字符与最后1个字符交换,第2个与倒数第二个交换......当中间剩余字符为1时,停止迭代。
交换过程的具体操作:
#include<stdio.h>
int my_strlen(char* str)
{
if (*str != '\0')
{
return 1+my_strlen(str + 1);
}
}
void reverse(char* arr)
{
char temp = 0;//临时变量,存储a的值
int left = 0;
int right = my_strlen(arr) - 1;
temp = *arr;
*arr = *(arr + right);//将后面的值赋给前面
*(arr + right) = '\0';//将最后一位变成'\0'
if (my_strlen(arr + 1) > 1)
{
reverse(arr + 1);
}
*(arr + right) = temp;//将临时变量中的值,赋给后面
}
int main()
{
char arr[] = "abcdef";
reverse(arr);
printf("%s\n", arr);
}
因为题目要求函数只能传一个参数,所以需要创建很多临时变量。
TEXT 6 计算一个数的每位之和(递归实现)
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(153),则应该返回1 + 5 + 3,它的和是9
输入:153,输出:9
思路:
153可拆分为15和+3;15可拆分为1和+5;1为各位数,停止递归,返回1。
#include<stdio.h>
int DigitSum(n)
{
int sum = 0;
if (n / 10 != 0)
{
sum =DigitSum(n / 10);
}
return sum += n % 10;
}
int main()
{
unsigned int num = 0;
scanf("%d", &num);
printf("%d\n", DigitSum(num));
return 0;
}
TEXT 7 递归实现n的k次方
利用函数pow(n,k)可以求n的k次方,pow函数的使用需要包含头文件<math.h>。
现在编写一个函数实现n的k次方,使用递归实现。
思路:
需要考虑到k的取值范围
#include<stdio.h>
double my_pow(double n,int k)
{
if (k > 0)
return n * my_pow(n, k - 1);
else if (k == 0)
return 1;
else
return 1.0 / my_pow(n, -k);
}
int main()
{
double n = 0.0;
int k = 0;
scanf("%lf%d", &n, &k);
printf("%g\n", my_pow(n, k));//%g,打印浮点数时省略无意义的0
return 0;
}
TEXT 8 计算斐波那契数
斐波那契数:1、1、2、3、5、8、13、21、34、56......从第三项开始,每一项的值等于前两项的和。
思路:
例如当n=5时,第5个斐波那契数=第四个斐波那契数(n-1)+第三个斐波那契数(n-2)
第四个斐波那契数=第三个斐波那契数(n-2)+第二个斐波那契数(n-3)
第三个斐波那契数=第二个斐波那契数1+第一个斐波那契数1。
#include<stdio.h>
int fibo(int n)
{
if (n > 2)
return fibo(n - 1) + fibo(n - 2);
else
return 1;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", fibo(n));
return 0;
}
TEXT 9 走台阶
n阶台阶,每次可以选择走一阶或者走两阶,那么一共有多少种走法?(1≤n≤30)
思路:
当n=1时,必然只有一种走法;当n=2时,有两种走法;以此类推,当n>2时,便有(n-1)+(n-2)种走法。
#include<stdio.h>
int sum(int n)
{
if (n > 2)
return sum(n - 1) + sum(n - 2);
else if (n == 2)
return 2;
else
return 1;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", sum(n));
return 0;
}
边栏推荐
- 13 power map
- Record: solution of 404 error of servlet accessing database in dynamic web project
- Interview Essentials: talk about the various implementations of distributed locks!
- 最新坦克大战2022-全程开发笔记-1
- Record: Navicat premium can't connect to MySQL for the first time
- Introduction and use of redis
- Comparison between FileInputStream and bufferedinputstream
- XV Function definition and call
- Alibaba cloud microservices (I) service registry Nacos, rest template and feign client
- 4.30动态内存分配笔记
猜你喜欢
Chromatic judgement bipartite graph
面渣逆袭:Redis连环五十二问,三万字+八十图详解。
学编程的八大电脑操作,总有一款你不会
Ten minutes to thoroughly master cache breakdown, cache penetration, cache avalanche
2-year experience summary, tell you how to do a good job in project management
Quickly generate illustrations
Interview Essentials: talk about the various implementations of distributed locks!
阿里云微服务(二) 分布式服务配置中心以及Nacos的使用场景及实现介绍
Questions and answers of "basic experiment" in the first semester of the 22nd academic year of Xi'an University of Electronic Science and technology
System design learning (I) design pastebin com (or Bit.ly)
随机推荐
String类
TYUT太原理工大学2022数据库大题之分解关系模式
Inheritance and polymorphism (Part 2)
Atomic and nonatomic
Implement queue with stack
Heap sort [handwritten small root heap]
Several high-frequency JVM interview questions
167. Sum of two numbers II - input ordered array - Double pointers
学编程的八大电脑操作,总有一款你不会
Branch and loop statements
Iterable、Collection、List 的常见方法签名以及含义
系统设计学习(二)Design a key-value cache to save the results of the most recent web server queries
View UI Plus 发布 1.2.0 版本,新增 Image、Skeleton、Typography组件
TYUT太原理工大学2022软工导论大题汇总
TYUT太原理工大学2022数据库题库选择题总结
Tyut Taiyuan University of technology 2022 introduction to software engineering
Record: the solution of MySQL denial of access when CMD starts for the first time
Tyut outline of 2022 database examination of Taiyuan University of Technology
十分鐘徹底掌握緩存擊穿、緩存穿透、緩存雪崩
Introduction pointer notes