第45课 - 递归的思想与应用(下)

1、递归的思想与应用 

        函数调用过程回顾 

            -程序运行后有—个特殊的内存区供函数调用使用 

                        用于保存函数中的实参,局部变量,临时变量,等 

                        从起始地址开始往—个方向增长(如:高地址.+低地址) 

                        有—个专用”指针”标识当前已使用内存的“顶部' 


                                                这片特殊的内存区域符合了数据结构的栈特性,叫栈区


        程序中的栈区:一段特殊的专用内存区

                        

                                            C语言课程关于此图已稍微介绍



        实例分析:逆序打印单链表中的偶数结点

            

        



2、编程实验 

函数调用栈分析     void r_print_even(Node* list) 

#include <iostream>

using namespace std;

struct Node
{
    int value;
    Node* next;
};

Node* create_list(int v,int len)
{
    Node* ret = NULL;
    Node* slider = NULL;

    for(int i=0;i<len;i++)
    {
        Node* n = new Node();

        n->value = v++;
        n->next = NULL;

        if(slider == NULL)
        {
            slider = n;
            ret = n;
        }
        else
        {
            slider->next = n;
            slider = n;
        }
    }

    return ret;
}

void destory_list(Node* list)
{
    while(list)
    {
        Node* del = list;

        list = list->next;

        delete del;
    }
}

void print_list(Node* list)
{
    while(list)
    {
        cout<<list->value<<"->";

        list = list->next;
    }

    cout<<"NULL"<<endl;
}

void r_print_even(Node* list)
{
    if(list != NULL)
    {
        r_print_even(list->next);   //除第一个结点外的结点(后续子表)

        if((list->value) % 2 == 0)
        {
            cout<<list->value<<endl;
        }
    }
}

int main()
{
    Node* list = create_list(2,5);

    print_list(list);

    r_print_even(list);

    destory_list(list);

    return 0;
}

                            




        八皇后问题 

                在—个8x8的国际象棋棋盘上,有8个皇后,写个皇后占

                一格;要求皇后间不会出现相互“攻击'的现象不能 

                有两个皇后处在同—行、同—列或同—对角线上)。 


        关键数据结构定义: 

            -棋盘:二维数组(10 * 10) 

                        0表示位置为空,1表示皇后,2表示边界

            -位置:struct Pos; 


        关键数据结构定义: 

             - 方向: 

                    水平: (-1, 0), (1, 0) 

                    垂直: (0, -1), (0, 1) 

                    对角线: (-1, 1), (-1, -1), (1, -1), (1, 1) 


        算法思路 

                1. 初始化: j = 1 

                2. 初始化: i = 1 

                3. 从第j行开始,恢复i的有效值(通过函数调用栈进行回溯 ),判断第i个位置 

                            a. 位置 i 可放入皇后:标记位置( i , j ) , j++, 转步骤2 

                            b. 位置 i 不可放入皇后: i++, 转步骤a 

                            c. 当i > 8时,j--,转步骤3 

               - 结束: 

                            第8行有位置可放入皇后 


3、编程实验 

八皇后问题的递归解法     class QueueSolution; 

coding...

4、小结 

            程序运行后的栈存储区专供函数调用使用 

            栈存储区用于保存实参,局部变量,临时变量,等 

            利用栈存储区能够方便的实现回溯算法 

            八皇后问题是栈回溯的经典应用 



猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/80411484