文章目录
(i)函数的递归要满足的条件
1.递归要有进入函数条件和跳出条件(限制条件)
2.每次递归都要逼近限制条件
//条件1、2是程序员设置的
*3.函数递归不会栈溢出
一、函数递归思路分享
(1)数学递归公式思想的发散与推广
a.先通过简单的枚举,看看只有一两个的时候,函数是怎么样递归的,例如有n个数的时候,先看看n=1和n=2时候的值是多少!(就相当于设置了跳出条件)
b.接着把n看成 n=n-1 + 1,在函数fun(n)的递归中就将fun(n-1)传值就好了
//相当于每次递归都会逼近跳出递归的条件
c.最后试着找出fun(n)与fun(n-1)、fun(n-2)之间的关系
(2)大事化小
核心:将复杂的问题一次一次的剥成一件件简单且思路相同的事情
二、经典例题代码思路分享(代码中有思路)
(1)裴波那切数列
函数递归求裴波那契数列的底n项值//1 1 2 3 5 8 13 21 34 55……
int fun(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return fun(n - 1) + fun(n - 2);//就是fun(n)=fun(n-1)+fun(n-2)
}
}
int main()
{
int n;
scanf("%d", &n);
int ret=fun(n);
printf("第%d个数的值为%d\n", n, ret);
return 0;
}
(2)汉诺塔问题
汉诺塔问题
void honis(int n, char a, char b, char c)
{
if (n == 1)
{
printf("%c-->%c\n", a, c);//将一个汉诺塔从a移动到c
}
else
{
honis(n - 1, a, c, b);//先将最上层的汉诺塔一道b柱子上
printf("%c-->%c\n", a, c);//接着将a柱子上的汉诺塔移到c上
honis(n - 1, b, a, c);//最后将b柱子上的汉诺塔通过a移到c柱子上
}
}
int main()
{
printf("请输入有几个汉诺塔:");
int n;
scanf("%d", &n);
printf("%d\n", n);
honis(n, 'a', 'b', 'c');//就是将a柱子上的汉诺塔通过b移动到c柱子上
}
(3)青蛙跳台阶
//青蛙跳台阶
int frog_jumps_steps(int n)
{
if (n == 1 || n == 0)//规定1 0个台阶就只有一种跳法
{
return 1;
}
else if (n == 2)//青蛙可以下子跳一个或两个台阶,所以有两种跳法
{
return 2;
}
else
{
return frog_jumps_steps(n - 2) + frog_jumps_steps(n - 1);
}
}
int main()
{
printf("请输入有几个台阶:");
int n;
scanf("%d", &n);
int ret = frog_jumps_steps(n);
printf("一共有%d种跳法\n", ret);
return 0;
}
(4)字符串逆序(递归实现)(函数)——大事化
/*
递归方式:
对于字符串“abcdefg”,递归实现的大概原理:
1. 交换a和g,
2. 以递归的方式逆置源字符串的剩余部分,剩余部分可以看成一个有效的字符串。
3. 再以类似的方式逆置
*/
void reverse_string(char* arr)
{
int len = strlen(arr);
char tmp = *arr;
*arr = *(arr+len-1);
*(arr+len-1) = '\0';
if(strlen(arr+1)>=2)
reverse_string(arr+1);
*(arr+len-1) = tmp;
}