递归小论(1)

2023-11-11 06:58
文章标签 递归 小论

本文主要是介绍递归小论(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请扫码加公众号大笑

 


       递归(recursion)算是接触的概念中于我最有吸引力的一个。

学习离散数学时,很多概念是递归定义的,感觉递归定义什么意思都没表达,但是莫名其妙就知道它会以什么形式出现,很有意思。

递归程序更有意思,程序员基本没做什么事,程序就自动完成了。

 

这种不劳而获的感觉

真是

太有吸引力了。

       

       递归到底是个什么鬼?

       在回答这个问题前,先看一下递归的原型(数学内的,不过放心,没有积分之类的鬼东西)

 

​ 数学上的递归

递归这个东西在高中数学就有出现,典型的是斐波那契数列:

  F(n)=F(n-1)+F(n-2)

 如果给定了初始的F(0)和F(1),这样整个数列的值也都是知道了。

 

斐波那契数列在手工求值的时候会比较麻烦,我们通过等比数列来描述递归是怎样运作的。(数学上)

A(n)=A(n-1)*2,A(0)=1

如果我们要求A(100),那么我们就要求A(99)

求A(99)就要求A(98)

求A(98)就要求A(97)

如此重复下去,我们为求A(1)的到A(0),因为A(0)已知,乘2即可的A(1)

这一部分叫分解

然后在用A(1)求A(2)…..用A(2)求A(3)

最后求得A(99),

然后由A(99)得到A(100)

这一部分叫啥我不知道,资料里面都是说合并,结合一类的,我喜欢用返回(因为的确是慢慢往最初的调用A(100)返回了)

数学上的递归有如下特征:

有基本情况

如等比数列的A(0),斐波那契F(0),F(1)

所有的复杂情况都可以转换成基本情况。

如果转换不成,这就不是一个成功的递归,因为你必须的想出一个其他方式来解决问题

复杂情况转化到简单一级情况的是一个函数关系(也就是说最后的复杂情况下是单值的,不可能出现重值情况)

 

计算机里的递归

递归也就是一个function调用自身。比如说

             voidaFun(int n)

             {

                    statement;

                    aFun(n-1);

             }

不过,这只是递归的形式而已,或者说函数调用自身只是递归的一个特点,递归的内涵要比自身调用自身这句简单的话深刻许多。

与递归最接近的思想叫做分治法(divide-and-conquer),当然递归还与别的相关,分治法是一个特别能直接体现递归解决问题的思路的方法。(递归回归到数学上本质是归纳法)

 

分治法描述:将原问题分解为几个规模较小的类似原问题的子问题,然后用同样的方式递归解决这些问题,最后在合并这些子问题的解来建立原问题的解。

 

 这一种描述很精巧,其中有几个关键的细节。

第一:分解的子问题能够采取同样的方式解决

第二:必须要有递归底层

第三:必须要有一个合并算法

 

第一点是很明显的,也是递归最容易让人记住的。子问题和大问题能够同样解决,但是说实话,这不是递归的难点。

在真正编写的时候,往往只是根据函数原型改写一个参数。唯一可能有点难度的就是说有时候要想办法构造一种变换把大问题转换成同样的小问题。

 

第二点.递归底层指的是最小的基本情况,就如斐波那契数列中的F(0),F(1)。如果没有这个递归底层,程序在运行的时候就会不断得改变参数,不断得调用自身,比如参数的变化规律是减去1,那么函数就会从function(100)一直递归到function(-300)…….直到内存因为函数帧爆掉。这和数学上是一样的,没有这个基本情况,计算机根本不可能完成任务。

第三点,合并算法。在真正编写递归函数的时候这是实现的灵魂。

只要脑子清醒,参数写的正确,计算机总能调用到递归的底层进行一些很细小的处理,那么说到了递归底层以后呢?发散出了那么多,最开始的问题还是没有解决吧。

这时候就要有用到合并算法往回解决了,通过合并算法往最初情况走。

什么意思?既然已经达到了递归的最基本情况,并且解决了最基本情况,那么接下来的事情就是综合这些结果。

比如我们最后递归下来有64个基本情况,合并算法是两两合并解决的,这样问题规模就变成32,继续合并变成16,最后回到1的情况。

 


这篇关于递归小论(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/388312

相关文章

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

【UVA】10651-Pebble Solitaire(直接递归或者记忆化)

不知道这个题UVA的数据是怎么的,用2个方法交了,第一次直接递归,第二次记忆化剪枝,时间竟然一样!? 直接郁闷了,简单的二进制表示状态和二进制运算。 14145176 10651 Pebble Solitaire Accepted C++ 0.009 2014-09-04 09:18:21 #include<cstdio>#include<algorithm>#inclu

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置