编写代码求字符串长度
方法一
利用库函数 strlen() #include< string >(头文件)
#include<stdio.h> #include<string> int main() { char arr[] = "crush"; int len = strlen(arr); printf("%d\n", len); return 0; }
方法二
创建临时变量
#include<stdio.h> int Count_lenght(char*arr) { int count = 0; while (*arr != '\0') { count++; arr++; } return count; } int main() { char arr[] = "crush"; int len = Count_lenght(arr); printf("%d\n", len); return 0; }
方法三
函数递归
#include<stdio.h> int Count_lenght(char* arr) { if (*arr != '\0') return 1 + Count_lenght(arr + 1); else return 0; } int main() { char arr[] = "crush"; int len = Count_lenght(arr); printf("%d\n", len); return 0; }
递归与迭代(循环)
求n的阶乘
递归
#include<stdio.h> int Fac(int i) { if (i < 2) return 1; else return i * Fac(i - 1); } int main() { int n = 0; scanf("%d", &n); int ret = Fac(n); printf("%d\n", ret); return 0; }
迭代(循环)
#include<stdio.h> int Fac(int n) { int i = 0; int ret = 1; for (i = 1; i <= n; i++) { ret *= i; } return ret; } int main() { int n = 0; scanf("%d", &n); int ret = Fac(n); printf("%d\n", ret); return 0; }
求第n个斐波那契数
函数递归
#include<stdio.h> int Fb(int i) { if (i > 2) return Fb(i - 1) + Fb(i - 2); else return 1; } int main() { int n = 0; int ret = 0; scanf("%d", &n); ret = Fb(n); printf("%d", ret); return 0; }
该函数的缺点是重复多次计算,不适用于计算较大的斐波那契数。
改进如下
迭代(循环)
#include<stdio.h> int Fb(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 = Fb(n); printf("ret = %d\n", ret); return 0; }
字符串逆序
迭代
#include<stdio.h> int my_strlen(char* str) { if ('\0' != *str) { return 1 + my_strlen(str + 1); } return 0; } void Reverse(char ch[]) { int left = 0; int right = my_strlen(ch) - 1; while (left < right) { char tmp = ch[left]; ch[left] = ch[right]; ch[right] = tmp; left++; right--; } } int main() { char ch[] = "crush"; printf("%s\n", ch); Reverse(ch); printf("%s\n", ch); return 0; }
递归 1
#include<stdio.h> int my_strlen(char* str) { if ('\0' != *str) { return 1 + my_strlen(str + 1); } return 0; } void Reverse(char* str) { //1.先保存第一个字符 char tmp = *str; int len = my_strlen(str); //2.将最后一个字符存放在第一个字符的位置 *str = *(str + len - 1); //3.将最后一个字符设置为\0,以便字符串长度的计算 *(str + len - 1) = '\0'; //4.进行中间字符串的逆序(除去第一个和最后一个字符) if (my_strlen(str + 1) > 1) { Reverse(str + 1); } //5.将第一个字符存放在最后一个字符的位置 *(str + len - 1) = tmp; } int main() { char ch[] = "crush"; printf("%s\n", ch); Reverse(ch); printf("%s\n", ch); return 0; }
递归 2
#include<stdio.h> int my_strlen(char* str) { if ('\0' != *str) { return 1 + my_strlen(str + 1); } return 0; } void Reverse(char ch[], int left, int right) { if (left < right) { char tmp = ch[left]; ch[left] = ch[right]; ch[right] = tmp; Reverse(ch, left + 1, right - 1); } } int main() { char ch[] = "crush"; printf("%s\n", ch); int left = 0; int right = my_strlen(ch) - 1; Reverse(ch,left,right); printf("%s\n", ch); return 0; }
总结,函数递归与迭代的选择。
只要不出现错误,哪个都行。