6.练习
1.题目:编写函数,不允许创建临时变量求字符串长度。
我们先看一下有临时变量的写法
#include <stdio.h> //数组名是数组首元素的地址 int my_strlen(char* str) { int count = 0; while (*str != '\0') { count++; str++; } return count; } int main() { char arr[] = "abcdef"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
效果展示:
本题目有条件限制,不能创建临时变量,my_strlen()函数里面的 count 就是临时变量,所以这个是个错误的,但是思路大致是这样。strlen 函数的求字符串长度的原理就是找 '\0' ,看 '\0' 前面有多少个字符,所以我们的思路也是这样的。
我们对上面的代码进行改写:
#include <stdio.h> //数组名是数组首元素的地址 int my_strlen(char* str) { if (*str != '\0') return 1 + my_strlen(str + 1); else return 0; } int main() { char arr[] = "abc"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
效果展示:
详解图示:
2.题目:求 n 的阶乘
#include <stdio.h> int factorial(int n) { if (n <= 1) return 1; else return n * factorial(n - 1); } int main() { int n = 0; scanf("%d", &n); int ret = factorial(n); printf("%d\n", ret); return 0; }
效果展示:
3.斐波那契数列
#include <stdio.h> int fib(int n) { 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); return 0; }
效果展示1:
效果展示2:
我们想一下fib()函数怎么运行呢,我们以图来研究:
这样就涉及十分大量的计算,计算机一直在工作,就是很费时间。
所以这个代码就是告诉我们,递归可以解决好多问题,但是不一定就是最合适的,递归虽好,可不要贪啊。
因此这个代码使用迭代写合适,下面我们对其进行改写:
#include <stdio.h> int fib(int n) { int a = 1; int b = 1; int c = 1; while (n > 2) { c = a + b; a = b; b = c; n--; } return c; } int main() { int n = 0; scanf("%d", &n); int ret = fib(n); printf("%d\n", ret); return 0; }
*************************************************函数章节完结**********************************************