再谈循环&迭代&回溯&递归&递推这些基本概念
循环:不断重复进行某一运算、操作。
迭代:不断对前一旧值运算得到新值直到达到精度。一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算
递推:从初值出发反复进行某一运算得到所需结果。-----从已知到未知,从小到达(比如每年长高9cm,20年180,30后270)
回溯:递归时经历的一个过程。
递归:从所需结果出发不断回溯前一运算直到回到初值再递推得到所需结果----从未知到已知,从大到小,再从小到大(你想进bat,那么编程就的牛逼,就得卸载玩者农药,努力学习)。递归(Recursion)是从归纳法(Induction)衍生出来的。
一个运算(操作),可以通过不断调用本身的运算形式,往往需要通过前一次的结果来得到当前运算的结果,因而,程序运行时,总是先一次次地「回溯」前一次的结果(回溯过程中这些结果是未知的,直到回溯到初值令回溯终止,再层层递推回来得到当前要求的值)
一个完整的递归应该有下面三个条件,否则就是不合格的递归
明确递归的终止方法(一个递归必须有他递推到头的界定,否则将会是无限递归 )
明确的终止时处理方法
重复调用自身并缩小问题规模
死循环不会栈溢出而无限递归会出现栈溢出情况,详情推荐阅读:《递归-程序之美,及其与循环的区别》,但实际上业务模型几乎不会遇到。
kidneyball知乎回答总结会精辟
在有循环的语言里,有的人认为尾递归优化除了炫技之外是完全无用的。其实不然,尾递归写法在我看来有以下好处
强迫你把循环写成单独的函数。这又有什么好处呢?这会影响你的编程风格,习惯使用尾递归之后,你的写出一个几百行大函数的机率会小得多。
保证没有副作用,统一使用不可变数据。在循环里,循环变量就是一个可变数据。作为人肉开发者,如果想保证自己的某段程序没有副作用,最好的做法就是根本不要写任何带副作用的东西,这样代码审查时一眼看过去就能知道有没有副作用。至于避免副作用有什么好处,这又可以写一篇文章,这里就不展开了。
转换成惰性序列时比较好看。在某些语言里,尾递归形式基本上只要去掉循环变量(变成无限递归), 把初始状态作为首元素,就是一个能直接拿来用的惰性序列。
“递归”是一种思路,这种思路的特点是:我不关注问题本身,我只关注这个问题如何可以用一种可重复的方式分解为一些规模更小的子问题,以及这些子问题与原问题的关系。再加上当问题的规模足够小的时候,存在一个简单直接的解法。
递推和递归还是迷糊,show code
//递归求解
function fib(n){
return n <2?1:fib(n-1) + fib(n-2);
}
//递推求解
function fib(n){
let start=0;
let fn=1;
for (let i=0;i<n;i++) {
let t=fn;
fn=fn+start;
start=t;
}
return fn;
}
不难看出,
程序的一般写法就好比是数列的通项公式。
程序的递归写法就好比是数列的递推公式。
原文链接:再谈循环&迭代&回溯&递归&递推这些基本概念 - 模型设计,领域设计,软件设计, - 周陆军的个人网站,不定时更新,文有不妥之处,请留言告知,多谢(再谈系列多为总结性文章(搬砖凑))。
推荐文章:
再谈循环&迭代&回溯&递归&递推这些基本概念的更多相关文章
- 蓝桥杯—BASIC-21 sine之舞(递归递推)
题目:最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数,所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力. 不妨设 An=sin(1– ...
- 【Java】递归递推的应用
利用阶乘公式来计算组合式: 程序设计思想: 根据公式来计算组合数的大小,从键盘输入n,k的值,设计一个计算阶乘的大小,如果输入的数a为1或0,则直接return 1,否则运用递归,计算a-1的阶乘,直 ...
- 第二场周赛(递归递推个人Rank赛)——题解
很高兴给大家出题,本次难度低于上一场,新生的六个题都可以直接裸递归式或者裸递推式解决,对于老生的汉诺塔3,需要找出一般式,后两题分别为裸ST算法(或线段树)/线性DP. 正确的难度顺序为 种花 角谷定 ...
- codeforce 227D Naughty Stone Piles (贪心+递归+递推)
Description There are n piles of stones of sizes a1, a2, -, an lying on the table in front of you. D ...
- 蓝桥杯—ALGO-12 幂方分解(递归递推)
问题描述 任何一个正整数都可以用2的幂次方表示.例如: 137=27+23+20 同时约定方次用括号来表示,即ab 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) 进一步 ...
- HDU 1143 Tri Tiling (递推)
Tri Tiling Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- hdu2089(数位DP 递推形式)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 2018南京区域赛G题 Pyramid——找规律&&递推
先手动推出前10项,再上BM板子求出递推式 $A_n = 5A_{n-1} - 10A_{n-2} + 10A_{n-3} - 5A_{n-4} + A_{n-5}$,根据特征根理论可求出特征方程 $ ...
- TheSierpinskiFractal(POJ-1941)【递推】
题意:用‘\’,'/','_'按照给定规则画出三角形 题目链接:https://vjudge.net/problem/POJ-1941 思路:题中的三角形生成规则是符合递推关系的,可以先手动完成第一个 ...
随机推荐
- C# Lambda表达式学习笔记
本笔记摘抄自:https://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html,记录一下学习过程以备后续查用. 一.Lambda ...
- jquery实现input输入框点击加减数值随之变动
<input class="addBtn min" type="button" value="-" /><input cl ...
- 8.JavaScript
1.JavaScript简介 JavaScript主要运行在客户端,用户访问带有JavaScript的网页,网页里的JavaScript程序就会传给浏览器,由浏览器解释和处理.表单数据的有效性验证等互 ...
- noi.ac #553 序列
[题目描述] 老虎和蒜头是好朋友. 众所周知,蒜头经常给老虎出一些题目,而老虎也常常被难倒,作为捧杯之王的老虎难免心有怨怼.今天,老虎发现了蒜头的一个序列 a .虽然老虎不知道这个序列是用来做什么的 ...
- 「SDOI2017」数字表格
题目链接 问题分析 \[ \begin{aligned} Ans&=\prod_{i=1}^n\prod_{j=1}^mf[\gcd(i,j)]\\ &=\prod_{t=1}^nf( ...
- [笔记]C++下的数组声明
/* 例子来源于<C++ Primer> */ ]; //prts是含有10个整数类型指针的数组 ]; //错误,没有引用的数组 ]; //指向有10个整型元素数组的指针 ]; //引用有 ...
- 微信小程序_(表单组件)checkbox与label
微信小程序组件checkbox官方文档 传送门 微信小程序组件label官方文档 传送门 Learn 一.checkbox组件 二.label组件与checkbox组件共用 一.checkbox组件 ...
- EFI/UEFI BIOS 入门
我们已经使用BIOS超过了二十年.可是直到今天还有许多朋友不知道BIOS到底是什么,以及它主要做些什么事情,它在整个个人计算机之中所处的地位如何.事实上,BIOS是整个计算机系统中最重要的底层系统软件 ...
- (十六)C语言之函数
- 石川es6课程---4、箭头函数
石川es6课程---4.箭头函数 一.总结 一句话总结: 相当于函数的简写,类似python lambda 函数,先了解即可 let show1 = function () { console.log ...