用递归的思想解决问题

//键盘输入1234,按顺序打印出1 2 3 4

1.

//设置一个函数print(int n) //1、先打印print(123) 4 //2、再打印print(12) 3 4 //3、再打印print(1) 2 3 4 //4、最后打印1 2 3 4

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

2.

//编写函数不允许创建临时变量,求字符串的长度 //第二种方法,采用递归的思想

int my_strlen(char* str) { if (*str != '\0') { //str+1指的是str指向的元素的地址加1以得到下一个元素的地址, //依次调用函数,每进行一次操作加1,直至字符串到达\0结束,就得到字符串的长度 return 1 + my_strlen(str + 1); } else { return 0; } } int main() { char arr[] = "bit"; //arr是数组,数组在调用函数传参时,传过去的不是整个数组,而是第一个元素的地址。 int len = my_strlen(arr); printf("%d\n", len); return 0; }

有些功能的实现不适合递归的

例如:

//斐波那契数列 // 1 1 2 3 5 8 13 21……

//1、采用循环的办法让效率提高

int fac(int x) { int a = 1; int b = 1; int c = 1; while (x > 2) { c = a + b; a = b; b = c; x--; } return c; } int main() { int n = 0; int sum = 0; scanf("%d", &n); sum = fac(n); printf("%d\n", sum); }

//2、用递归测试效率有点低下

int fac(int x) { if (x > 2) { return fac(x - 1) + fac(x - 2); } return 1; } int main() { int n = 0; int sum = 0; while (1) { scanf("%d", &n); sum = fac(n); printf("%d\n", sum); } }