温馨提示:函数部分中比较难一块,需要大量的积累和练习,不懂的地方多调试,和画图,才能有递归的思想!!!!
博主就是不懂就画图,画完图就茅塞顿开
看这个思维导图,我大致说一下他的运用场景,和下面的例子比较好理解
递归自己直接或间接调用自己,把一个大型的问题层层转换成一个小的问题,需要的代码也是少之又少,大大减少了代码量,递归思想:大事化小,看例子吧,结合例子比较好懂。
下面举的例子没有提到的思路都在这里
输入123打印 1 2 3
思路
void print(int n)
{
if (n >9)
{
print(n / 10);//n大于9就进入递归,直到n<9是跳出递归
}
printf("%d ", n % 10);
}
int main()
{
int num = 123;
print(num);
return 0;
}
函数从哪里进来就要从哪里返回回去
n的阶乘(迭代)
int Fib(int n)
{
int i = 0;
int fib = 1;
for ( i =1; i <=n; i++)
{
fib = fib * i;
}
return fib;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret =Fib(n);
printf("%d", ret);
return 0;
}
n的阶乘(递归)
int Fib(int n)
{
if (n <2)
{
return 1;
}
else
{
return n*Fib(n - 1) ;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d", ret);
return 0;
}
模拟实现strlen
strlen(迭代版)
int my_strlen(char* a)//传过来地址,也用地址接收
{
int count = 0;
while(*a != '\0')
{
a++;
count++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
printf("%d", my_strlen(arr));//数组的地址就是首元素
return 0;
}
strlen(递归版)
int my_strlen(char* a)//传过来地址,也用地址接收
{
if (*a != '\0')
{
return 1 + my_strlen(a + 1);//这里不要用a++或者++a,不然会改变a的值假设这不是数组是变量
}
else
return 0;
}
int main()
{
char arr[] = "abcdef";
printf("%d", my_strlen(arr));//数组的地址就是首元素
return 0;
}
斐波那契数列
规律就是,前面俩数向加得出后面那个数
递归版
int Fib(int n)
{
if (n <= 2)//斐波那契数列前俩位是1 1
{
return 1;
}
else
{
return Fib(n - 1) + Fib(n - 2);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d",Fib(n));
return 0;
}
看一下流程图
迭代版
int Fib(n)
{
int a = 1;
int b = 1;
int c = 1;
if (n <= 2)
{
return c;//斐波那契前面俩数是
}
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d", Fib(n));
return 0;
}
是不是以为程序挂了,不不不,其实计算机在很努力的在算,不信我给你看
骗你是小狗
………………………………喝了一杯水,还没好,又是一杯,还没好,煎熬
………………………………,哦出来了花了6分43秒
为啥递归要花怎么长时间呢,应为他的效率低
因为他假设要找第50,他就要找的第49 和48然后就要,然后找49就要找到48和47………………,找一位数就进行了多次重复大量的计算,算出这个数大致算了2^n-1次方
迭代版 1
#include
void reverse_string(char* a,int s)//传过来是地址就用地址接收
{
int left = 0;
int right = s - 1;
while(left<right)
{
char cmp = *(a + left);//=str[left]
*(a + left) = *(a + right);
*(a + right) = cmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
int st = strlen(arr);
reverse_string(arr,st);//数组的地址就是首元素
printf("%s", arr);
return 0;
}
迭代版 2
#include
void reverse_string(char* a, int s)//传过来是地址就用地址接收
{
int left = 0;
int right = s - 1;
while (left < right)
{
char cmp = a[left];//=str[left]
a[left] = a[right];
a[right] = cmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
int st = strlen(arr);
reverse_string(arr, st);//数组的地址就是首元素
printf("%s", arr);
return 0;
}
递归版
这里想到递归的思路很难,谁能想到,吧后面给换成\0,然后在字符串长度对比天呐!!
void reverse_strling(char* str)
{
char tmp = *str;
int len = strlen(str);
*str = *(str + len - 1);
*(str + len - 1) = '\0';
if (strlen(str + 1) >= 2)
{
reverse_strling(str + 1);
}
*(str + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdef";
reverse_strling(arr);//数组的地址就是首元素
printf("%s", arr);
return 0;
}
这里总结得出,递归与跌代,不向上下,各有各的好处,作为裁判的我(公平公正)平局
栈(现在所认识到的)
正常跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳上3级。
求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
A=1,2,3. B =0. C= 0
青蛙跳台阶和汉诺塔,会在下期更新…………
(如果有错误记得联系博主(QQ:1696912943),或者直接在评论区提出,私信,博主会及时进行改正,谢谢)
持续更新中………………