首页 > 其他分享 >1、尾递归及优化 ,例:斐波那契数列 2、递归转循环,蹦床函数

1、尾递归及优化 ,例:斐波那契数列 2、递归转循环,蹦床函数

时间:2023-01-03 15:47:30浏览次数:39  
标签:调用 return 函数 递归 斐波 Fibonacci 蹦床 优化

1、函数调用自身,即为递归,在return时调用自身,即为尾递归;
递归非常消耗内存,其原因是需要同时保存成成百上千的调用帧,这容易发生栈溢出错误;但是尾递归只存在一个调用帧,所以永远不会发生栈溢出
尾递归的优化:只有不再用到外层函数的内部变量,内层函数的调用帧才会取代外层函数的调用帧;否则就无法使用'尾递归的优化'

没优化的写法:
function Fibonacci(n){
if(n <= 1){
return 1
}
return Fibonacci(n-1) + Fibonacci(n-2)
}
调用:Fibonacci(5)

优化后的写法:
function Fibonacci(n, total = 1){
if(n <= 1){
return total
}
return Fibonacci(n-1, n * total)
}
调用:Fibonacci(5);
好处:不会产生栈溢出错误,相对节省内存

2、蹦床函数——将递归执行转为循环执行

标签:调用,return,函数,递归,斐波,Fibonacci,蹦床,优化
From: https://www.cnblogs.com/MrZhous/p/17022375.html

相关文章

  • 简单聊聊:递归,缓存,分治,回溯
    一、初识递归递归函数=终止条件+递归关系终止条件:当大问题被拆解成能轻松解决的小问题时,运行终止条件中的逻辑递归关系:定义如何将大问题拆解为小问题例子:小名跑步。......
  • 斐波那契公约数证明
    斐波那契公约数证明已知\(F_n\)为斐波那契数列,求证:\(∀n,m∈Z^+,(F_n,\F_m)=F_{(n,\m)}\)证明:令\(n<m\),\(F_n=F_1*a,\F_{n+1}=F_2*b\)\(F_{......
  • 算法基础之全排列(递归)
    全排列(递归)全排列就是从第一个数字起每个数字分别与他后面的数进行交换。去重的全排列就是从第一个数起每个数分别与它后面非重复出现的数字交换。全排列(不去重)//搜索/......
  • 函数和递归
    函数是什么库函数自定义函数函数参数函数调用函数的嵌套调用和链式访问函数的声明和定义函数递归函数是什么?维基百科定义:子程序在计算机科学中,子程序是一个大型程序中的部分......
  • 递归算法
    一、递归实现N!.代码实现:packagecn.test;/***@author徐庶*@date2016年9月6日*/publicclassRecursive{//递归privatestaticlongfactorial(intn){if(n......
  • 关于递归Collapse 折叠面板和实现分层折叠互斥效果
    近期要用Collapse折叠面板实现一个递归效果,直接上效果图,实现最终效果是每一层的内容互斥,组件递归的的时候为了实现每一层内容互斥要给每一个el-collapse加上一个v-model,......
  • 程序:用递归法计算字符串长度
    #include<stdio.h>intmy_strlen(char*str){if(*str!='\0')return1+my_strlen(str+1);elsereturn0;}intmain(){intret=0;chararr[]="hibi......
  • 程序:用递归法依次打印1234数字
    #include<stdio.h>voidprint(inta){if(a>9){print(a/10);}printf("%d",a%10);}intmain(){inta=1234;print(a);return0;}......
  • C语言--函数2--递归2
    递归--判断一个一维数组是否递增#include<stdio.h>#defineN5//判断一个一维数组是否递增/*Judge_dz:判断一个一维数组是否递增@a:一维数组名@n:元素个数返回值:无*......
  • 掌握二叉搜索树的双指针 + 公共祖先加深对后序遍历和递归的理解
    530.二叉搜索树的最小绝对差intmin=Integer.MAX_VALUE;TreeNodepre;/***<Ahref="https://leetcode.cn/problems/minimum-absolute-difference-in-......