- 本文章属于 数据结构与算法 专栏系列,欢迎关注,链接: 数据结构与算法。文章会持续更新,希望大家多点赞收藏加转发!
- 专栏 文章总目录 链接:数据结构与算法!
文章目录
- 一. 什么是递归
-
- 1.1. 递归的定义
- 1.2. 何时使用递归
- 1.3. 递归模型
- 二. 递归算法的设计
-
- 2.1. 递归算法设计的步骤
- 2.2. 基于递归数据结构的递归算法设计
- 2.3. 基于递归求解方法的递归算法设计
- 三. 递归总结
-
- 3.1. 递归技术总结
- 3.2. 递归算法设计总结
- 3.3. 递归函数设计中几个问题
一. 什么是递归
1.1. 递归的定义
1.2. 何时使用递归
1.3. 递归模型
- 下面的例子: 统计全国GDP这个大问题转化为北京市,上海市。然后又继续划分,直到某个企业。
#include <iostream>
using namespace std;
int fib(int n)
{
if (n == 1 || n == 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n = 6;
cout << fib(n) << endl;
system("pause");
return 0;
}
8
请按任意键继续. . .
二. 递归算法的设计
2.1. 递归算法设计的步骤
#include <iostream>
#include <vector>
using namespace std;
float f(vector<float> &arr, int i)
{
float m;
if (i == 0)
return arr[0];
else
{
m = f(arr, i - 1);
return m > arr[i] ? arr[i] : m;
}
}
int main()
{
vector<float> arr = {
1, 2.2, 3, 5, 8, 9, 10, 3.3, 0.5};
cout << f(arr, arr.size() - 1) << endl;
system("pause");
return 0;
}
0.5
请按任意键继续. . .
2.2. 基于递归数据结构的递归算法设计
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
LNode *next;
} LNode, *LinkList;
void input(ElemType *ep)
{
cout << "input the data of linklist: ";
cin >> *ep;
}
void createLinkF(LinkList *L, int n, void (*input)(ElemType *))
{
LinkList s;
*L = new LNode;
(*L)->next = NULL;
for (; n > 0; n--)
{
s = new LNode;
input(&s->data);
s->next = (*L)->next;
(*L)->next = s;
}
}
void printLinkList(LinkList s)
{
while (s != NULL)
{
cout << s->data << " ";
s = s->next;
}
}
int count(LinkList s)
{
if (s == NULL)
return 0;
else
return count(s->next) + 1;
}
int main()
{
LinkList L;
int n;
cout << "input the length of linklist: ";
cin >> n;
createLinkF(&L, n, input);
printLinkList(L->next);
cout << "\nthe length of linklist(count): ";
cout << count(L->next) << endl;
system("pause");
return 0;
}
input the length of linklist: 5
input the data of linklist: 22
input the data of linklist: 33
input the data of linklist: 44
input the data of linklist: 12
input the data of linklist: 24
24 12 44 33 22
the length of linklist(count): 5
请按任意键继续. . .
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
LNode *next;
} LNode, *LinkList;
void input(ElemType *ep)
{
cout << "input the data of linklist: ";
cin >> *ep;
}
void createLinkF(LinkList *L, int n, void (*input)(ElemType *))
{
LinkList s;
*L = new LNode;
(*L)->next = NULL;
for (; n > 0; n--)
{
s = new LNode;
input(&s->data);
s->next = (*L)->next;
(*L)->next = s;
}
}
void traverse(LinkList s)
{
if (s == NULL)
return;
cout << s->data << " ";
traverse(s->next);
}
void traverse_R(LinkList s)
{
if (s == NULL)
return;
traverse_R(s->next);
cout << s->data << " ";
}
int main()
{
LinkList L;
int n;
cout << "input the length of linklist: ";
cin >> n;
createLinkF(&L, n, input);
cout << "traverse:";
traverse(L->next);
cout << "\ntraverse_R:";
traverse_R(L->next);
system("pause");
return 0;
}
input the length of linklist: 4
input the data of linklist: 1
input the data of linklist: 2
input the data of linklist: 3
input the data of linklist: 4
traverse:4 3 2 1
traverse_R:1 2 3 4
请按任意键继续. . .
2.3. 基于递归求解方法的递归算法设计
三. 递归总结
3.1. 递归技术总结
3.2. 递归算法设计总结
3.3. 递归函数设计中几个问题