一.递归的定义
程序调用自身的编程技巧(大事化小)
二.递归的必要条件
1.函数递归必须存在限制条件(if语句),当满足限制条件时,递归便不再继续。
2.每次递归调用之后会越来越接近这个限制条件。
三.递归基础例题(1)
1.接收一个无符号(%u-unsigned int无正负数)的整型值,按顺序打印它的每一位
(eg:input:1234------output:1 2 3 4)
1234%10=4;
1234/10=123;
123%10=3;
123/10=12;
12%10=2;
12/10=1;
1%10=1;
//法1:常规法:将逆序的每一位按照数组储存起来,再逆序打印
//法2:函数的递归
/*思路:
print(1234);
print(123)4;
print(12)34;
print(1)234;
->1234
*/
#include <iostream>
using namespace std;
void print(unsigned int num)
{
if (num > 9)//递归必须要有限制条件,若去掉if,则stack overflow(栈溢出)
{
print(num/10);//打印123的每一位
}
cout << num % 10 << " ";//打印4
//先不打印,全部调用完再打印
}
int main()
{
cout << "请输入一个无符号的整数:";
unsigned int num;
cin >> num;
print(num);
return 0;
}
图解:
2.编写函数,不创建临时变量,求字符串的长度
(即模拟实现strlen())
//strlen()的实现
#include <iostream>
using namespace std;
//法1:参数部分写成数组的形式(char str[])
//法2:参数部分写成指针的形式
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
str++;
count += 1;
}
return count;
}
int main()
{
char str[] = "abcdef";
int ret = 0;
ret = my_strlen(str);
cout << ret << endl;
return 0;
}
用递归的方式求解的思路:(不能创建临时变量)
//用递归模拟实现strlen()
#include <iostream>
using namespace std;
int my_strlen(char str[])
{
if (*str != '\0')//递归的限制条件
{
return 1+my_strlen(str + 1);//不能用str++,会导致先传入str,再++
}
else//字符串为0
{
return 0;
}
//先传递的加法先不进行运算,要先向后看,当*str=='\0',才进行运算,即0+1+1+1+1+1+1
}
int main()
{
char str[] = "abcdef";
int ret = 0;
ret = my_strlen(str);
cout << ret << endl;
return 0;
}
3.计算n的阶乘
//法1:利用迭代(循环)实现
#include <iostream>
using namespace std;
int fac(int num)
{
int i = 0;
int ret = 1;
for (i = 1; i <= num; i++)
{
ret=ret*i;
}
return ret;
}
int main()
{
cout << "请输入要实现的数字的阶乘:";
int num = 0;
cin >> num;
int ret = 0;
ret = fac(num);
cout << ret << endl;
return 0;
}
利用递归实现的思路:
//法2:利用递归实现
#include <iostream>
using namespace std;
int fac(int num)
{
if (num <= 1)
{
return 1;
}
else
{
return num * fac(num - 1);
}
}
int main()
{
cout << "请输入要实现的数字的阶乘:";
int num = 0;
cin >> num;
int ret = 0;
ret = fac(num);
cout << ret << endl;
return 0;
}
4.求第n个斐波那契数列
(1,1,2,3,5,8,13......)
递归实现思路:
//用递归实现斐波那契数列
#include <iostream>
using namespace std;
int Fib(int num)
{
if (num <= 2)
{
return 1;
}
else
{
return Fib(num - 1) + Fib(num - 2);
}
}
int main()
{
cout << "请输入你要求第几个斐波那契数:";
int num = 0;
cin >> num;
int ret = 0;
ret=Fib(num);
cout << ret << endl;
return 0;
}
用递归方式求斐波那契数列缺点:大量重复,导致运行效率低下
----->用迭代法求效率更高
//用迭代法求斐波那契数列
#include <iostream>
using namespace std;
int Fib(int num)
{
int a = 1;
int b = 1;
int c = 0;
while (num >= 3)
{
c = a + b;
a = b;
b = c;
num--;//注意观察规律变化
}
return c;
}
int main()
{
cout << "请输入你要求第几个斐波那契数:";
int num = 0;
cin >> num;
int ret = 0;
if (num == 1 || num == 2)
{
ret = 1;
}
else
{
ret = Fib(num);
}
cout << ret << endl;
return 0;
(------更多例题会在后面上传------)