递归
递归
递归设计经验
~找重复(子问题)
划分子问题
1.找到一种划分方法
2.找到递推公式或者等价转换
~找重复中的变化量——>参数
变化的量通常作为参数
~找参数变化驱使——>设计出口
练习策略
~循环该递归
~经典递归
~大量练习,总结规律,掌握套路
~找到感觉,挑战高难度
递归基础练习
· 求阶乘
#include <iostream>
using namespace std;
int factorical(int x) {
if (x==1) return 1;
return x*factorical(x-1);
}
int main()
{
int x;
cin>>x;
cout<<factorical(x)<<endl;
return 0;
}
· 打印i~j
#include <iostream>
using namespace std;
void print(int i, int j) {
if (i>j)
return;
cout<<i<<' ';
print(i+1,j);
}
int main()
{
int i,j;
cin>>i>>j;
print(i,j);
return 0;
}
· 数组求和
#include <iostream>
#include <cstring>
using namespace std;
int sum(int array[],int begin,int end)
{
if (begin==end) return array[end];
else return array[begin]+sum(array,begin+1,end);
}
int main()
{
int array[10]={1,2,3,4,5,6,7,8,9,10};
cout<<sum(array,0,9);
return 0;
}
· 翻转字符串
#include <iostream>
#include <string>
using namespace std;
string flip_string(string str,int index)
{
if (index==0) return ""+str[0];
return str[index]+flip_string(str,index-1);
}
int main()
{
string s=flip_string("abcd",3);
cout<<s<<endl;
return 0;
}
不知道为什么出现了乱码问题,求大神指点。
· 斐波那契数列
#include <iostream>
using namespace std;
int Fibonacci(int num)
{
if (num==1||num==2) return 1;
return Fibonacci(num-1)+Fibonacci(num-2);
}
int main()
{
cout<<Fibonacci(10)<<endl;
return 0;
}
· 最大公约数
#include <iostream>
using namespace std;
int gcd(int m,int n)
{
if (n==0) return m;
return gcd(n,m%n);
}
int main()
{
int m,n;
cin>>m>>n;
int num=gcd(m,n);
cout<<num<<endl;
return 0;
}
· 插入排序改递归
#include <iostream>
using namespace std;
int array[10] = {9, 7, 5, 3, 1, 2, 4, 6, 8, 10};
void insertsort(int array[], int k) {
//出口条件判断
if (k == 0) return;
//对前k-1个元素排序
insertsort(array, k - 1);
//把位置k的元素插入到前面的部分
int x = array[k];
int index = k - 1;
while (index >= 0 && x < array[index]) {
array[index + 1] = array[index];
index--;
}
array[index + 1] = x;
}
int main() {
insertsort(array, 10);
for (int i = 0; i < 10; ++i) {
cout << array[i] << ' ';
}
return 0;
}
· 汉诺塔
#include <iostream>
using namespace std;
void Hanoi(int N, string from, string to, string help) {
if (N == 1) {
cout << "move " << N << " from " << from << " to " << to << endl;
return;
}
//先把前N-1个盘子挪到辅助空间上去
Hanoi(N - 1, from, help, to);
//N可以顺利到达target
cout << "move " << N << " from " << from << " to " << to << endl;
//让N-1从辅助空间回到源空间上
Hanoi(N - 1, help, to, from);
}
int main() {
Hanoi(3, "A", "B", "C");
return 0;
}