(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

相关文章

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

C++ 重建二叉树(递归方法)

/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/#include <vector>class Solution {public:/*** 代码

大学生自救数据结构与算法(py实现)——01递归

目录 目录 递归 基本概念 工作原理 基本要素 优点 缺点 实现技巧 实例解析:计算阶乘 斐波那契数列 高效的斐波那契数列 python中的最大递归深度 二分查找 基本原理 性能分析 优化与变体 线性递归  元素序列的递归求和 二路递归 二路递归的基本概念 典型应用 工作原理 多重递归  示例:计算卡特兰数(Catalan Number) 尾递

HCIA 19 结束 企业总部-分支综合实验(下)

3.6出口NAT配置可以访问互联网 配置NAT使内网可以访问公网8.8.8.8,当前总部PC1 PING不通公网地址8.8.8.8。 3.6.1总部配置NAT访问互联网 步骤1:配置NAT acl number 2000    rule 5 permit source 192.168.0.0 0.0.255.255 # interface GigabitEthernet0/0/2

对递归执行过程的简单描述

1. 分析代码 #include <stdio.h>void fun(int n){printf("1th - Level: %d Address: %d\n", n, &n);if(n < 3)fun(n+1);printf("2th - Level: %d Address: %d\n", n, &n);}int main(){fun(1);return 0;} 输出结果为:

vue+elementui搭建后台管理界面(5递归生成侧栏路由) vue定义定义多级路由菜单

有一个菜单树,顶层菜单下面有多个子菜单,子菜单下还有子菜单。。。 这时候就要用递归处理 1 定义多级菜单 修改 src/router/index.js 的 / 路由 {path: '/',redirect: '/dashboard',name: 'Container',component: Container,children: [{path: 'dashboard', name: '首

汉诺塔问题的java递归实现

import java.util.Scanner;public class Hanoi {int count=0;public void hanoi(int n,char A,char B,char C){ //把n个盘子移动到ccount++;if(n==1){System.out.println("盘子1从"+A+"移动到"+C); //再把最下边那个最大的盘子移到目标柱c上}el

二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度

二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度计算 输入格式:如   abd###ce##f##*   package tree;//二叉树的二叉链表实现import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;import java.util.Sta

递归 迭代 得到家谱树 子孙树

<?php $arr=array(array('id'=>'1','name'=>'吉林','parent'=>0),array('id'=>'2','name'=>'北京','parent'=>0),array('id'=>'3','name'=>'辽宁','parent'=>0),array('id'=>'4','name'=>'吉林市','parent'=>1),array('id'=>'5

「LeetCode」递归题目之第N个Tribonacci数

Tribonacci序列Tn定义: T0=0, T1=1, T2=1, n>=0时,Tn 3 = Tn Tn 1 Tn 2 限制条件是: 0<=n<=37, 32位整型。 我直接用C 撸了下面的代码, #include <iostream>using namespace std;class Solution {public:int tribonacci(int n) {if (n ==