简单了解递归
1.什么是递归???
编程程序调用自身的编程技巧称为递归( recursion)
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接 或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的 规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计 算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小
但是要特别注意在不停的调用函数自身是有可能会产生栈溢出
2.递归的两个必要条件
(1.)存在限制条件,当满足这个限制条件的时候,递归便便不再继续。
(2.)每次递归调用之后越来越接近这个限制条件。
特点:能用递归处理的问题都是可以用它的子问题来处理(相同的代码)
接下来看道题
把一个整型(无符号),转化为字符型并打印出来
#include<stdio.h> #include<Windows.h> void print(num) { if (num > 9) { print(num/10); } printf("%c ", num % 10 + '0'); } int main() { int num = 0; num = 4567; print(num); system("pause"); return 0; }
2.编写函数不允许创建临时变量,求字符串的长度
int Strlen(const char*str) { if (*str == '\0') return 0; else return 1 + Strlen(str + 1); } int main() { char *p = "abcdef1234"; int len = Strlen(p); printf("%d\n", len); system("pause"); return 0; }
3.求第n个斐波那契数列
例如:
1、1、2、3、5、8、13、21、34、……这样的一串数字叫做斐波那契数列
int Fib(int n) { if (n <= 2) return 1; return Fib(n - 1) + Fib(n - 2); } int main() { int n = 0; printf("请输入一个数》\n"); scanf_s("%d", &n); Fib(n); printf("%d\n", Fib(n)); system("pause"); return 0; }3.
4.求n的阶乘(不考虑溢出)
int factorial(int num) { if (num == 1) return 1; return num * factorial(num - 1); } int main() { int num = 0; printf("请输入一个数:"); scanf_s("%d", &num); factorial(num); printf("%d\n", factorial(num)); system("pause"); return 0; }