数据结构——递归

数据结构——递归

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值