练习递归函数的C语言案例
1. 接受一个整型值(无符号),按照顺序打印它的每一位。
例如数字1234
//1234
//1 2 3 4
//借助于print(1234)函数
//print(123)4
//print(12) 3 4
//print(1) 2 3 4
再完成代码之前,我们先理以下思路。
假设输出1234,想按顺序打印1 2 3 4 .我们可以创建一个if判断语句,若我们输出的值大于9,那我们用这个数字%10,1234%10=4;随后再用1234/10=123;将123%10=3;再用123/10=12;将12%10=2,再用12/10=1;此时跳出判断,利用递归将其按顺序打印。
#include<stdio.h> void print(unsigned int n) //n=1234 { if (n > 9) { print(n / 10); //print(123) 1 2 3 } printf("%d ", n % 10); } int main() { unsigned int num = 0; scanf("%d", &num);//1234 print(num); return 0; }
2. 编写函数不允许创建临时变量,求字符串的长度。
再使用递归方法完成此题目之前,我们先看看两个非递归的方法:
法一:库函数strlen法:
#include<stdio.h> int main() { //求字符串长度 char arr[] = "abc"; int len = strlen(arr); printf("%d\n", len); return 0; }
#include<stdio.h> int my_strlen(char* s ) { int count = 0; //printf("%c\n", *s); 打印出a while (*s != '\0') { count++; s++; } return count; } int main() { //求字符串长度 char arr[] = "abc"; //arr是数组名,数组名是数组首元素的地址 int len = my_strlen(arr); printf("%d\n", len); return 0; }
法三:不创建临时变量,求字符串长度(递归)
#include<stdio.h> int my_strlen(char* s) { if (*s == '\0') return 0; else return 1 + my_strlen(s + 1); } int main() { //求字符串长度 char arr[] = "abc"; //arr是数组名,数组名是数组首元素的地址 int len = my_strlen(arr); printf("%d\n", len); return 0; }
同样的,我们也通过画图分析下:
#include<stdio.h> #include<string.h> int my_strlen(char* s) { char* start = s; while (*s != '\0') { s++; } return s - start; } int main() { char arr[] = "abc"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
3. 求n的阶乘。(不考虑溢出)
法一(循环):
#include<stdio.h> int main() { int n = 0; int i = 0; int ret = 1; scanf("%d", &n); //循环产生1到n-1的数字 for (i = 1; i <= n; i++) { ret = ret * i; } printf("%d\n", ret); return 0; }
#include<stdio.h> int fac(int n) { if (n <= 1) return 1; else return n * fac(n - 1); } int main() { int n = 0; scanf("%d", &n); int ret = fac(n); printf("%d\n", ret); }
4. 求第n个斐波那契数。(不考虑溢出)
斐波那契:
1 1 2 3 5 8 13 21 34 55
第三个数字等于前面两个数字和,最前面两个数字都是1
法一 (递归)(此方法不太合适,效率太低)
#include<stdio.h> int count = 0; int fib(int n) { if (n == 3) count++; if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } int main() { int n = 0; scanf("%d", &n); int ret = fib(n); printf("%d\n", ret); printf("%d\n", count); return 0; }
上一篇: C语言递归算法:计算1到100的总和
下一篇: 如何输出long double?
推荐阅读
-
C语言猜数字游戏:的练习
-
详解:C语言实现猜数字大小的小游戏(随机生成100以内的整数)-srand函数
-
第9天学C语言(关于2个练习:例如在屏幕上输出乘法口诀表)+(猜数字小游戏)+(goto语句的一点)
-
用C语言重命名文件的库函数rename
-
C语言中的文件操作及其函数应用介绍
-
探索C语言学习笔记:透视递归函数
-
C语言必会100题(6)。利用递归方法求5!/利用递归函数调用方式,反向打印字符/五个人问岁数/输入一个不多于5位数的整数,判断是几位数/输入一个5位数,判断它是不是回文数
-
递归函数的使用与C语言相关
-
C语言第七章:深入理解C语言函数中的复杂递归——C语言中间递归函数
-
深入剖析C语言中的递归机制