zoukankan      html  css  js  c++  java
  • 递归之杨辉三角实例讲解

    本文利用杨辉三角来具体说明一个递归的实现,实现的条件,如果理解不对的地方还请指教。

    一、杨辉三角说明

    杨辉三角是二项式系数在三角形中的一种集合排列。下面引用wiki上的动态图来展示一下。

    相信大家看了这张图应该就能明白杨辉三角了吧。下面在代码中讲解递归。、

    二、代码讲解

    #include<iostream>
    using namespace std;
    #define max 10
    /*下面定义的这个数组本来是要递归一遍直接记录在数组里面的,而不用每求一个再去递归,但是这道题不大使用,因为在if条件里面有一个return,
    如果改的话,就直接计算了,可以不用递归了,所以这里算是强行用一波递归吧嘿嘿嘿*/
    int print[max][max] = { 0 };
    
    int digui(int row, int col) {
        if (col == 0 || row == col) {
            print[row][col] = 1;
            return 1;
        }
        else {
            return digui(row - 1, col - 1) + digui(row - 1, col);//这个的值就是前面的两个数相加得来
        }
    }
    
    void main() {
        for (int _row = 0; _row < max; _row++) {
            for (int _col = 0; _col <= _row; _col++) {
                printf("%5d", digui(_row, _col));
            }
            printf("
    ");
        }
    }

    首先,如果做的听的递归的题目多了之后,就会发现,递归要满足两个条件:

    一是,要有使递归进行下去的变量,在这里就是row和col(行和列);

    二是,要有终止递归的条件,在这里就是当row和col相等或者col==1的时候。

    递归在经典的问题中用到很多,下面写几个问题的伪程序:

    斐波那契数列

    13世纪意大利数学家斐波那契的《算盘书》中记载了典型的兔子产仔问题,其大意如下:

    如果一对一个月大的兔子以后每一个月都可以生一对小兔子,而一对新生的兔子出生两个月才可以生出小兔子。也就是,1月份出生,3月份开始产仔。那么假定一年内没有产生兔子死亡事件,那么1年之后共有多少对兔子呢?

    int Febonaci(int n) {
        int t1, t2;
        if (n > 0) {
            if (n == 1 || n == 2)
                return 1;
            else {
                t1 = Febonaci(n-1);
                t2 = Febonaci(n-2);
                return t1 + t2;//规律是第n个月的兔子数等于前一个月和前两个月的兔子数之和;
            }
        }
        else {
            return 0;
        }
    }

    汉诺塔

    题意:把a上的num个轮盘通过b移动到c上,这num个罗盘大小均不相同,规则是:大罗盘必须在小轮盘上面。

    /*这里的num是罗盘的数量,a是罗盘最初在的杆,b是借用实现转移的杆,c是罗盘最终要移动到的杆*/
    hanota(num,a, b, c) {
        if (num == 1)
            move(1,a, c);
        else {
            hanota(num - 1, a, c, b);//把num-1个罗盘移动到b上
            move(num, a, c);//把最大的罗盘移动到c上
            hanota(num - 1, b, a, c);//把num-1个罗盘移动到c上
    } }

    三、最后

               最后说一下,递归的实现过程吧,我简单说一下,然后给出一个详细说明的链接。

    首先应该知道函数时保存在栈中的,当调用函数调用一个被调用函数的时候,就将这个被调用函数压入栈中,并且保存这个函数的“状态“(包括实参等)最后入栈的是调用函数的返回地址,当这个函数执行的时候,调用函数的自变量又被压入栈中。当前面的被调用函数有调用函数的时候,就会继续压栈。所以递归不能无限执行,会溢出。当这个函数执行完的时候,就会被弹出栈,接着执行下一个函数,这里的如何找到下一个函数,是通过一个地址指针。

    详细说明

  • 相关阅读:
    js原生图片拼图Demo
    display:inline-block在ie7下的解决办法
    Apollo 配置中心部署注意事项
    chrony 时间同步配置
    IPv6基础介绍
    Rabbitmq 报错 nodedown
    Maven 私服你应该不陌生吧,可你会用 Artifactory 搭建吗?
    你 MySQL 中重复数据多吗,教你一招优雅的处理掉它们!
    MySQL 数据库的基本使用
    自建 yum 源
  • 原文地址:https://www.cnblogs.com/kevin-lee123/p/7096090.html
Copyright © 2011-2022 走看看