首页 > 其他分享 >尾递归与非尾递归(线性递归)

尾递归与非尾递归(线性递归)

时间:2022-09-24 15:56:15浏览次数:48  
标签:调用 函数 递归 递归函数 参数 与非 线性

1 尾递归与非尾递归区别
非尾递归(线性递归):当数量很大时,会造成栈溢出。因为每次递归调用时,递归函数中的参数,局部变量等都要保存在栈中。
尾递归:return时只调用自身,不能有额外的操作。不用花费大量的栈空间来保存上次递归中的参数,局部变量等。因为上次递归操作结束后,已经将之前的数据计算出来,传递给当前的递归函数,上次递归中的局部变量和参数等被删除,释放空间,从而不会造成栈溢出。

2 尾递归特点
(1)递归调用时通过覆盖当前的栈,而不是额外创建新的栈,来减少栈空间的使用和栈的分配释放开销;栈顶不用往下展开再调回函数
(2)尾递归把变化的参数传递给递归函数的变量(比线性递归多一个参数)。这个参数是上一次调用函数得到的结果;所以,关键点在于尾递归每次调用收集结果,避免了线性递归不收集结果只能依次展开消耗内存的坏处。

3 栈调用的区别
普通递归函数自身调用次数很多,递归层级很深,栈空间为0(n),尾递归优化后栈空间可为O(1)。
调用栈是解释器追踪函数执行流的一种机制。简单来说就是能够通过调用栈追踪到哪个函数正在执行,执行的函数中有调用了哪个函数)

标签:调用,函数,递归,递归函数,参数,与非,线性
From: https://www.cnblogs.com/3511rjzn/p/16725781.html

相关文章

  • C语言递归汉诺塔
    #include<stdio.h>intmain(){voidhanoi(intn,charone,chartwo,charthree);intm;printf("Inputthenumberofdiskes:");scanf("%d",&m);......
  • 函数递归
    CREATEDEFINER=`root`@`%`FUNCTION`queryParentAreaInfo`(areaIdINT)RETURNSvarchar(4000)CHARSETutf8mb4BEGINDECLAREsTempVARCHAR(4000);DECLAREsTempChd......
  • Vue组件递归渲染
    父级菜单  数据格式  子组件递归(直接使用name) ......
  • 【线性dp】 [SCOI2009]粉刷匠
    点个关注点个赞吧一道比较简单的线性dp题目前置知识:会手推一些简单的状态转移方程、较为熟练地掌握背包问题模型[SCOI2009]粉刷匠题目描述windy有\(N\)条木......
  • 递归、迷宫问题
    简介递归需遵守的规则应用实例代码实现publicclassMiGong{ publicstaticvoidmain(String[]args){ //先创建一个二维数组,模拟迷宫 //地图......
  • 二叉树遍历(递归、迭代)
    前中后序遍历递归法//前序遍历varpreorderTraversal=function(root){letres=[];constdfs=function(root){  if(root===null)return;  //先序遍历所......
  • 基础线性代数
    基础线性代数矩阵变换将向量逆时针旋转90°:左乘0-110将向量延长至两倍:左乘2002矩阵乘法#include<bits/stdc++.h>#defineMod1000000007#definema......
  • 数据结构:线性表
    线性表线性表(List):零个或多个数据元素的有限序列。首先它是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都......
  • BM31对称二叉树(判断二叉树是否symmetric?)(递归)
    描述给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)例如:                 下面这棵二叉树是对称的下面这棵二叉树不对称。数据范围......
  • 编写程序,使用递归方法,实现统计项目目录下有多个java文件,共有多少行代码
    importjava.io.File;importjava.io.FileInputStream;/***@authorMxhlin*@[email protected]*@Date2022/09/21/14:55*@Version*@Description*......