数据结构——递归

it2026-08-05  23

数据结构——递归

c++版(清华邓俊辉版) 整理书本习题,啊啊啊,习题集还没到,就只能做书上的题。 loving to learn, loving to share.

1.什么是递归算法

递归算法就是直接或间接调用自身。递归细分还可以分为线性递归,二分递归等。 个人理解就是,“大题小做”,将大问题拆分成若干个相似的小问题,大篇幅的减少代码,同时提高代码的可读性。

2.递归算法的优缺点

优点:

1.思维简单 2. 代码简洁

缺点:

1.调用自身,效率低,时间慢

2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率

3.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能

递归倒置字符数组(常规版)

#include"stdafx.h" #include<iostream> #include<cstring> //strlen() 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--]);//交换两个位置,lo依次加1,hi依次减1 } } 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;//>>1相当于除以2 return sum(A, lo, mi) + sum(A, mi + 1, hi);//相当于左边一半+右边一半,依次递归,数组区间由最初的n项逐渐缩减为1项 } 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啦,第一篇博客,以后多多更新。顺便也可以督促自己学习数据结构。有啥错误,欢迎大家留言。

最新回复(0)