数据结构——递归
c++版(清华邓俊辉版) 整理书本习题,啊啊啊,习题集还没到,就只能做书上的题。 loving to learn, loving to share.
1.什么是递归算法
递归算法就是直接或间接调用自身。递归细分还可以分为线性递归,二分递归等。 个人理解就是,“大题小做”,将大问题拆分成若干个相似的小问题,大篇幅的减少代码,同时提高代码的可读性。
2.递归算法的优缺点
优点:
1.思维简单 2. 代码简洁
缺点:
1.调用自身,效率低,时间慢
2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率
3.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能
递归倒置字符数组(常规版)
#include
"stdafx.h"
#include
<iostream
>
#include
<cstring
>
using namespace std
;
char str
[1000];
int i
, j
= 1;
void inverse(int len
, char s
[])
{
if (len
== 1)
return;
else if (len
>1)
{
swap(s
[i
++], s
[strlen(str
) - (j
++)]);
cout
<< s
<< endl
;
len
-= 2;
inverse(len
, s
);
}
}
int
main()
{
int len
;
cout
<< "请输入数组长度和数组:" << endl
;
cin
>> len
>> str
;
inverse(len
, str
);
cout
<< str
<< endl
;
return 0;
}
递归倒置字符数组—迭代版
#include
<iostream
>
using namespace std
;
void reverse(int
* A, int lo
, int hi
)
{
while (lo
< hi
)
{
swap(A[lo
++], A[hi
--]);
}
}
void reverse(int
* A, int n
)
{
reverse(A, 0, n
- 1);
}
int
main()
{
int a
[] = { 1,2,3,4,5,6,7,8,9,10 };
cout
<< "the reversed array is :";
for (int i
= 0; i
< sizeof(a
) / sizeof(int
); i
++)
{
cout
<< a
[i
] << " ";
}
system("pause");
return 0;
}
数组求和—二分版
#include
<iostream
>
using namespace std
;
const int
N = 1000;
int a
[N];
int
sum(int
A[], int lo
, int hi
) {
if (lo
== hi
) return A[lo
];
int mi
= (lo
+ hi
) >> 1;
return sum(A, lo
, mi
) + sum(A, mi
+ 1, hi
);
}
int
main() {
int n
;
cin
>> n
;
for (int i
= 0; i
< n
; i
++) {
cin
>> a
[i
];
}
cout
<< sum(a
, 0, n
- 1) << endl
;
return 0;
}
菲波那切数列
题目描述:
斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。 现在我们要求数列的第n项。
#include
"stdafx.h"
#include
<iostream
>
using namespace std
;
int
fib(int n
)
{
return (n
< 2) ? n
: (fib(n
- 1) + fib(n
- 2));
}
int
main()
{
int n
;
cout
<< "请输入数字:" << endl
;
cin
>> n
;
cout
<< fib(n
) << endl
;
return 0;
}
okk啦,第一篇博客,以后多多更新。顺便也可以督促自己学习数据结构。有啥错误,欢迎大家留言。