0
点赞
收藏
分享

微信扫一扫

递归

梦为马 2022-03-24 阅读 52


递归

递归设计经验

~找重复(子问题)

划分子问题
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;
}



举报

相关推荐

0 条评论