(3.1)递归与分支之递归

2024-06-08 06:38
文章标签 递归 3.1 分支

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

文章目录

    • 1.递归的定义
    • 2.递归的基本思想
    • 3.应用eg
    • 4.递归与尾递归(非递归形式)

1.递归的定义

  • 递归:
    子程序(或函数) 直接调用自己或通过一系列调用语句间接调用自己,称为递归。
    递归是一种描述问题和解决问题的基本方法。
  • eg:函数A中的语句直接调用了函数A本身,这叫做直接递归调用。
void A()
{ …A();}
  • eg:间接递归调用
void B()
{...C();...
}void C()
{...B();...
}

2.递归的基本思想

  • 问题分解
  • 递归的要素:
    ⑴ 递归边界条件:确定递归到何时终止,也称为递归出口;
    ⑵ 递归模式:大问题是如何分解为小问题的,也称为递归体。

3.应用eg

  • eg:阶乘函数
    在这里插入图片描述
递归算法
int fact ( int n )
{if ( n == 0 ) //边界条件return 1;else return n * fact (n-1);//递推关系式
}
  • 求解阶乘 n! 的过程
    在这里插入图片描述

  • 递归过程与递归工作栈
    (1)递归过程在实现时,需要自己调用自己。
    (2)层层向下递归,返回次序正好相反:
    (3)通过栈知道,函数调用就是通过栈来返回地址和参数传递的过程,因为他参数传递是用地址保存的;
    递归也是通过栈来实现参数传递和他的解的值的传递
    在这里插入图片描述

  • eg:使用非递归算法
    能不用递归,就不用递归;
    利用栈来实现非递归的算法,来提高效率;
    不少递归问题就是尾递归,可以不借助栈,直接改成循环,效率高些;
    写成递归形式,就是好看,容易理解;

    在这里插入图片描述

非递归算法
int fact ( int n )
{int f=n;while(--n>=1)//循环实现递归调用,避免使用递归,这里就是尾递归的方式f*=n;return f;
}

4.递归与尾递归(非递归形式)

  • eg1:Fibonacci数列求解.
    在这里插入图片描述
递归求解:
int f (int n)
{if (n<=1)return (n);elsereturn (f(n-1)+f(n-2));//递归关系式是作为return返回的,所以他是尾递归,所以可以改成循环语句,
}非递归求解,即:尾递归
int f(int n)
{ //pre:前一次Fibc的值;//now:现在Fibc的值;//next:下一次Fibc的值;int pre, now, next, j;if (n<=1) return (n);else{ pre=0;now=1;for(j=2;j<=n;j++){ next=pre+now;pre=now;now=next;}return(next);//j=n时,就是最终的解,直接return}
}
  • eg2:回文串
    如果一个字符串从左向右读和从右向左读完全相同 (不区分大小写),则这个字符串称为回文串(palindrome),例如“noon” 、“madam” 等都是回文串。
    (1)递归思路
    在这里插入图片描述
    (2)非递归思路,即尾递归思路
    在这里插入图片描述
递归方法:
bool palindrome(string &s,unsigned h,unsigned t)//h:字符串的起始地址,t:字符串的结束地址
{if (h>=t) //S是空串或长度为1return 1;if(tolower(s[h])==tolower(s[t]))//tolower都转换成小写return palindrome(s,h+1,t-1);//这里递归关系只在return的时候存在,也就是说这是尾递归,可以改成循环elsereturn 0;//返回是不是回文串
}
尾递归方法:
bool palindrome(string &s)
{int h=0,t=strlen(s)-1;while (h<=t){if (totlower(s[h])!=tolower(s[t]))return 0;else{h++;t--;}}return 1;
}

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



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

相关文章

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

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

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

JavaEE7 Servlet 3.1(JSR 340)规范中文版

http://www.iteye.com/news/27727-jinnianshilongnian     Jave EE 7中的部分规范已正式获得批准通过,其中包括JSR340 Java Servlet 3.1规范,去年翻译了该规范,在此分享出来,希望对某些朋友有所帮助,不足之处请指正。   点击直接下载    在线版目录   Servlet3.1规范翻译

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 版中查询层次结构数据的快速