第四十五课 递归的思想与应用(下)

g函数返回后,f函数对应的栈中的数据没有任何变化,这就是回溯算法的核心。

可以这样思考,先逆序打印从第二个节点开始的子表,最后再将第一个节点打印出来。

 1 #include <iostream>
 2 #include <cstring>
 3 #include "DTString.h"
 4
 5 using namespace std;
 6 using namespace DTLib;
 7
 8 struct Node
 9 {
10     int value;
11     Node* next;
12 };
13
14 Node* create_list(int v, int len)  // v:数据元素从哪一个之开始。 len:长度
15 {
16     Node* ret = NULL;
17     Node* slider = NULL;
18
19     for(int i=0; i<len; i++)
20     {
21         Node* n = new Node();
22
23         n->value = v++;
24         n->next = NULL;
25
26         if( slider == NULL )
27         {
28             slider = n;
29             ret = n;
30         }
31         else
32         {
33             slider->next = n;
34             slider = n;
35         }
36     }
37
38     return ret;
39 }
40
41 void destroy_list(Node* list)
42 {
43     while( list )
44     {
45         Node* del = list;
46
47         list = list->next;
48
49         delete del;
50     }
51 }
52
53 void print_list(Node* list)
54 {
55     while( list )
56     {
57         cout << list->value << "->";
58
59         list = list->next;
60     }
61
62     cout << "NULL" << endl;
63 }
64
65
66
67 void r_print_even(Node* list)
68 {
69     if( list != NULL)
70     {
71         r_print_even(list->next);
72
73         if( (list->value % 2) == 0 )
74         {
75             cout << list->value << endl;
76         }
77     }
78 }
79
80 int main()
81 {
82     Node* list = create_list(2, 5);
83
84     print_list(list);
85
86     r_print_even(list);
87
88     destroy_list(list);
89
90     return 0;
91 }

逆序打印栈的增长与退栈示意图:

退栈打印的过程就是回溯的过程。

递归调用的时候只是先将参数保存在栈上,这时这个参数还没有用到,只是让指针指向了相应的节点,退栈的时候才用到。

类似于走迷宫,走到一个路口时先做个标记,这个标记暂时不用,回来的时候再用。根据标记找来时的路。

回溯的本质就是做标记,这样方便回退。

八皇后:

放皇后的时候只需要关注箭头的方向,因为其他的方向还没有放任何东西。

当我们发现某一行的任何一个位置都不能放皇后的时候,就开始要回溯了。因为,这证明了上一行放置皇后的地方是错误的。

当我们发现第i行的任何一个位置都不能放置皇后了,这就证明了第i-1行放置的位置是错误的。

如果发现第i-1行也没有地方可以放置皇后了,这意味着还要继续回退,退到i-2行,这就是回溯。

理论上,每放置一个皇后要判断8个方向,但是我们从第一行开始放置皇后,有规律的放,因此,只需要考虑三个方向。

如果判断一个位置的左下角对角线是否已经放置了皇后,那就在这个位置的基础上,在xy坐标上不断的减一。因此,方向数据很重要。左下角方向数据是(-1,-1)。

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9678384.html

时间: 2024-07-29 23:22:44

第四十五课 递归的思想与应用(下)的相关文章

JAVA学习第四十五课 — 其他对象API(一)

一.System类 1. static long currentTimeMillis() 返回以毫秒为单位的当前时间. 实际上:当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量). long time = 1414069291407l;//long型 后面加l System.out.println(time); 2. static void exit(int status)终止当前正在运行的 Java 虚拟机. static void gc()运行垃圾回收器

JAVA学习第四十五课 — 其它对象API(一)System、Runtime、Math类

一.System类 1. static long currentTimeMillis() 返回以毫秒为单位的当前时间. 实际上:当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位測量). long time = 1414069291407l;//long型 后面加l System.out.println(time); 2. static void exit(int status)终止当前正在执行的 Java 虚拟机. static void gc()执行垃圾回收器

python第四十五课——继承性之多继承

测试模块 演示多继承的结构和使用: 子类:Child 直接父类(多个):Father.Mother 注意: 由于有多个直接父类,多个父类都要自己给其属性赋值, 避免混淆,我们使用类名.__init__(...)这样格式的构造调用 from child import Child c = Child(100000000,'漂亮','python') print(c.money,c.faceValue,c.work) c.playing() c.shopping() c.smoking() 原文地址:

NeHe OpenGL教程 第三十五课:播放AVI

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错.你可以试试. 首先我得说我非常喜欢这一章节.Jonat

NeHe OpenGL教程 第四十二课:多重视口

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十二课:多重视口 多重视口 画中画效果,很酷吧.使用视口它变得很简单,但渲染四次可会大大降低你的显示速度哦:) 欢迎来到充满趣味的另一课.这次我将向你展示怎样在单个窗口内显示多个视口.这些视口在窗口模式下能正确的调整大小.其中有

NeHe OpenGL教程 第二十五课:变形

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第二十五课:变形 变形和从文件中加载3D物体: 在这一课中,你将学会如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型. 欢迎来到这激动人心的一课,在这一课里,我们将介绍模型的变形.需要注意的是各个模型必须要有相同的顶点,

OpenGL教程翻译 第十五课 相机控制(二)

OpenGL教程翻译 第十五课 相机控制(二) 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) Background 在这一节中我们将使用鼠标来控制相机的方向,从而得我们的相机控制更加完善.相机有不同的自由程度,这与其设计有关.在本教程中我们将要实现的是与第一人称游戏中相似的相机控制(如枪战类游戏).这意味着我们将可以使相机完成360度的旋转(绕着Y轴),这与我们的头部向左转向右转.身体转一整圈类似.除此之外我们也能使相机向上或者向下倾斜以获得更好的向

centos shell编程6一些工作中实践脚本 第四十节课

centos   shell编程6一些工作中实践脚本    第四十节课 上半节课 下半节课 f

什么是四十五

四十五,创作手机的照片墙. 她,是一款手机墙纸制作工具. 以照片墙的风格,将45张有故事的图片拼起来. 有Ta,毕业前,拼一张,留下回忆,让那些花儿伴你掌心:有Ta,旅游后,拼一张,留下心情,让沿途精彩一次尽览:有Ta,手机壁纸才有故事.