数据结构复习--递归

递归复习提纲

递归的定义:

在定义一个过程或函数时,出现直接或者间接调用自己的成分,称之为递归

  • 若直接调用自己,称之为直接递归
  • 若间接调用自己,称之为间接递归

一般来说间接递归总可以转化为直接递归

尾递归:递归函数中递归调用语句是最后一条执行语句

  • 尾递归算法可以用循环语句转化为等价的非递归算法
  • 非尾递归算法可以通过栈来转化为等价的非递归算法(递归对问题顺序的处理,是遵循了先入后出的规律)

何时使用递归:

  1. 定义是递归的
    • Fibonacci数列
    • 正整数的定义
    • ……
  2. 数据结构是递归的
    • 不带头节点的单链表
    • ……
  3. 问题的求解方法是递归的
    • Hanoi问题
    • ……

递归模型:递归模型是算法的抽象,反映一个递归问题的递归结构

  • 递归模型由递归出口和递归体两部分组成
  • 递归出口确定递归的结束
  • 递归体确定求解时的递推关系式

递归步骤

  • 把一个大问题分解为一个或者几个类似的小问题
  • 小问题继续分解
  • 直到每个小问题可解

这里的相似是指求解过程和环境都相似

递归的执行过程由分解求值两部分组成

  • 分解可以看成是入栈的过程
  • 求值可以看成是到达递归出口后依次出栈的过程

典型例题

  1. 假设a数组含有1,2,3,…,n,求其全排列

    分析过程略
# include<stdio.h>

void swap(int &a, int &b);
void perm(int a[], int n, int k);

int main()
{
   int a[] = {1,2,3};
   perm(a, 3, 2);
   return 0;
}

void swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}

void perm(int a[], int n, int k)
{
    if (k == 0)
	{
		for (int i = 0; i < n; i++) printf("%d",a[i]);
		printf("\n");
	}
	
	else
	{
		for (int i = 0; i <= k; i++)
		{
			swap(a[i], a[k]);
			perm(a, n, k-1);
			swap(a[i], a[k]);
		}
			
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值