首页 > 其他分享 >栈和递归

栈和递归

时间:2023-04-15 12:32:16浏览次数:31  
标签:移到 递归 C1.1 圆盘 调用函数 B1.3

递归定义

若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的;若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。递归就是定义体中再次出现被定义项本身。

被定义项在定义体中再次出现时,要满足两个要求:更小的尺度,最小尺度上要有明确定义。

例如:递归求n的阶乘

具有递归特性的数据结构:二叉树、广义表

以下三种请况常常用到递归方法:

①递归定义的数学函数

②具有递归特性的数据结构

③可递归求解的问题

递归问题——用分治法求解

分治法:对于一个较为复杂的问题,能够分解成几个相对简单的且解法相同或类似的子问题来求解

必备的三个条件

1.能将一个问题转变成一个新问题,而新问题与原问题的解法相同或类同,不同的仅是处理的对象,且这些处理对象是变化有规律的

2.可以通过上述转化而使问题简化

3.必须有一个明确的递归出口,或称递归的边界

分治法求解递归问题算法的一般形式:

void p(参数)
{
  if(递归结束条件)
    可直接求解步骤;-----基本项
  else
    p(较小的参数);-----归纳项
}

函数调用过程

调用前,系统完成:

(1)将实参,返回地址等传递给被调用函数

(2)为被调用函数的局部变量分配存储区

(3)将控制转移到被调用函数的入口

调用后,系统完成:

(1)保存被调用函数的计算结果

(2)释放被调用函数的数据区

(3)依照被调用函数保存的返回地址将控制转移到调用函数

栈和递归_递归

栈和递归_调用函数_02

栈和递归_递归_03

递归函数调用的实现

栈和递归_调用函数_04

递归的优缺点

优点:结构清晰,程序易读

缺点:每次调用要生成工作记录,保存状态信息,入栈;返回时要出栈,恢复状态信息。时间开销大。

递归→非递归的方法

方法1:尾递归、单向递归→循环结构

方法2:自用栈模拟系统的运行时栈

栈和递归_递归_05

单项递归→循环结构

栈和递归_调用函数_06

栈和递归_递归_07

借助栈改写递归的方法(了解)

栈和递归_递归_08

栈和递归_调用函数_09

n阶汉诺塔问题

假设有3个分别命名为A、B和C的塔座,在塔座A上插有n个直径大小各不相同、依小到大 编号为l,2,…,n的圆盘,现要求将A上的n个圆盘移至C上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则:

(1)每次只能移动一个圆盘;

(2)圆盘可以移至A、B和C中的任一塔座上;

(3)任何时刻都不能将一个较大的圆盘压在较小圆盘之上。 

栈和递归_分治法_10

栈和递归_调用函数_11

栈和递归_调用函数_12

栈和递归_分治法_13

栈和递归_递归_14

栈和递归_调用函数_15

栈和递归_递归_16

栈和递归_分治法_17

n阶汉诺塔问题的解决方案:

将1~n号从A经B移至C

若n=1,则直接将A移到C

否则:

1.将1~n-1号从A经C移到B

2.将n号从A移到C

3.将1~n-1号从B经过A移到C

3阶汉诺塔问题

将1~3号从A经过B移到C

1.将1~2号从A经C移到B

1.将1~1号从A经B移到C  A→C

2.将2号从A移到B   A→B

3.将1~1号从C经A移到B  C→B

2.将3号从A移到C   A→C

3.将1~2号从B经过A移到C

1.将1~1号从B经C移到A   B→A

2.将2号从B移到C    B→C

3.将1~1号从A经B移到C   A→C

重要练习——5阶汉诺塔

将1~5号从A经B移到C

1.将1~4号从A经C移到B

1.1将1~3号从A经B移到C

1.1.1将1~2号从A经C移到B

1.1.1.1将1~1号从A经B移到C  A→C

1.1.1.2将2号从A移到B    A→B

1.1.1.3将1~1号从C经A移到B  C→B

1.1.2将2号从A移到C   A→C

1.1.3将1~2号从B经A移到C

1.1.3.1将1~1号从B经C移到A  B→C

1.1.3.2将2号从B移到A   B→A

1.1.3.3将1~1号从A经B移到C  A→C

1.2将4号从A移到B  A→B

1.3将1~3号从C经过A移到B

1.3.1 将1~2号从C经B移到A

1.3.1.1将1~1号从C经A移到B  C→B

1.3.1.2将2号从C移到A  C→A

1.3.1.3 将1~1号从B经C移到A  B→A

1.3.2将3号从C移到B  C→B

1.3.3 将1~2号从A经C移到B

1.3.3.1将1~1号从A经B移到C  A→C

1.3.3.2 将2号从A移到B  A→B

1.3.3.3 将1~1从C经A移到B C→B

2.将5号从A移到C  A→C

3.将1~4号从B经过A移到C

3.1 将1~3号从B经C移到A

3.1.1将1~2号从B经A移到C

3.1.1.1 将1~1号从B经C移到A  B→A

3.1.1.2 将2号从B移到C  B→C

3.1.1.3 将1~1号从A经B移到C  A→C

3.1.2 将3号从B移到A  B→A

3.1.3 将1~2号从C经B移到A

3.1.3.1 将1~1号从C经A移到B C →B

3.1.3.2 将2号从C移到A  C→A

3.1.3.3 将1~1号从B经C移到A  B→A

3.2 将4号从B移到C  B→C

3.3 将1~3号从A经B移到C

3.3.1 将1~2号从A经C移到B

3.3.1.1将1~1号从A经B移到C  A→C

3.3.1.2 将2号从A移到B  A→B

3.3.1.3 将1~1号从C经A移到B  C→B

3.3.2 将3号从A移到C   A→C

3.3.3 将1~2号从B经A移到C 

3.3.3.1 将1~1号从B经C移到A  B→A

3.3.3.2 将2号从B移到C  B→C

3.3.3.3 将1~1号从A经B移到C  A→C

代码实现

#include<stdio.h>
int c=0;
void move(char x,int n,char z)
{
	printf("%d.move disk%d from %c to %c\n",++c,n,x,z);
}
void hanoi(int n,char x,char y,char z)
{
	if(n==1)
		move(x,1,z);
	else
	{
		hanoi(n-1,x,z,y);
		move(x,n,z);
		hanoi(n-1,y,x,z);
	}
}
int main()
{
	hanoi(5,'A','B','C');
	return 0;
}

栈和递归_调用函数_18


标签:移到,递归,C1.1,圆盘,调用函数,B1.3
From: https://blog.51cto.com/heliotopekxy/6192279

相关文章

  • 递归算法;求n的阶层
    java:importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Stringa=sc.next();intb=Integer.parseInt(a);System.out.print(factorial(b));}p......
  • 两个循环搞定多级菜单列表递归成tree
    菜单类publicstaticclassMenu{Menu(Stringdata){String[]split=data.split("");this.id=Integer.valueOf(split[0]);this.name=split[1];this.pid=Integer.valueOf(split[2]);......
  • JS函数:递归函数与迭代函数
    1.递归函数:程序中调用自己的函数程序调用自身的编程技巧称为递归(recursion)。递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归......
  • 二叉树先序,中序,后序遍历的非递归算法(一)
    前序遍历的非递归算法<法一>思路:二叉树的前序遍历过程:从树根开始沿着左子树一直深入,直到最左端无法深入时,返回;进入最近深入时遇到结点的右子树,再进行如此的深入和返回;直到最后从根节点的右子树返回到根节点为止;由其深入返回的过程我们知道可以用一个栈来帮助我们消除递归......
  • 优化 PMU 放置 (OPP) 问题的六种算法,包括两种模拟退火方法、两种图论过程和递归安全 N
    PMU优化配置 系统完全可观软件:MATLAB优化PMU放置(OPP)问题的六种算法,包括两种模拟退火方法、两种图论过程和递归安全N算法。 从MatPower获得的IEEE14,30,39,57和118bus系统数据,可得出系统完全可观所需配置pmu数量以及对应位置。配有对应文献ID:16150671665749743......
  • POJ 1780 Code (欧拉回路+非递归版dfs)
    题目地址:POJ1780还是求序列的欧拉回路。只不过这题有两坑。第一坑是用数字来当点的话,会MLE,因为每个数字可以连10条边,100w条边会MLE,即使用vector也会TLE。这题可以用边来记录,对于n为1时直接输出,然后后面的,比如12,23这两个点就用边权值为123来表示这两个点,这样就把点和边的范围......
  • 如何用递归实现简单的单括号匹配
    1.什么是括号匹配?直觉上是这个形式的:((3+5)*8+9)+(5/3-3)对于计算机而言其主要特征是:(1)在从左向右读取括号的过程中,左括号数量总是大于等于右括号(2)同样,从右向左读取时,右括号数量总是大于等于左括号(3)读取结束时,左右括号相等。2.算法雏形(1)我们需要处理掉表达式左侧及右侧的非......
  • 求n的阶乘(递归调用)
    求n的阶乘。#include<iostream>usingnamespacestd;unsignedfac(unsignedm){ unsignedn; if(m==0) n=1; else n=fac(m-1)*m; returnn;}intmain(){ unsignedx,y; cin>>x; y=fac(x); cout<<y; return0;}......
  • oracle递归查询法
    select*from表名startwith查询的条件connectbyprior等值条件(一个表中两个值相等的字段)查询的结果集:满足连接的值=查询条件,startwith子句:遍历起始条件,有个小技巧,如果要查父结点,这里可以用子结点的列,反之亦然。connectby子句:连接条件。......
  • [转载]php递归生成树形结构(几种常见的数据结构)
    版权声明:本文为CSDN博主「陈文焕」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_23116221/article/details/109910846pid找上级id$array=array(array('id'=>1,'pid'=>0,'n'=>'河北省'),ar......