• 递归


    递归的基本思想,是把规模较大的一个问题,分解成规模较小的多个有相同解法的子问题去解决。

    递归算法的设计要遵从4条以下基本法则:

    1. 基准情形必须总要有某些基准情形,它无须递归就能解决出来。

    2. 要有进展对于那些需要递归求解的情形,每一次递归调用都必须要使状况朝向一种基本情形推进。

    3. 设计法则假设所有递归调用都能运行。

    4. 合成效益法则在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。

    虽然递归的设计能使程序代码变得简洁,利于维护,但并不是所有符合递归设计法则的问题都能进行递归设计,递归也有其自身的缺点

    1.递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间,这就导致程序的运行效率降低。

    2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如斐波那契数列的递归实现。

    3.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。

    一般来说,递归可以利用栈将程序非递归化,比如用栈可以实现对二叉树和图深度优先的非递归化遍历。

    同时,对于一些问题较大的、递归层次较深的,应采用非递归化的设计,避免程序崩溃。

  • 相关阅读:
    mysql 存储过程实例
    国际会议查询方式和相关会议
    用 WEKA 进行数据挖掘,第 1 部分: 简介和回归(转)
    java实现甘特图的2种方法:SwiftGantt和Jfree (转)
    通过jxl 读取excel 文件中的日期,并计算时间间隔
    R 操作矩阵和计算SVD的基本操作记录
    SVD java 算法实现
    聚类方法简介
    Kolmogorov-Smirnov检验
    Java Thread 多线程 介绍
  • 原文地址:https://www.cnblogs.com/lincz/p/10681523.html
Copyright © 2020-2023  润新知