再谈循环&迭代&回溯&递归&递推这些基本概念

循环:不断重复进行某一运算、操作。

迭代:不断对前一旧值运算得到新值直到达到精度。一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算

递推:从初值出发反复进行某一运算得到所需结果。-----从已知到未知,从小到达(比如每年长高9cm,20年180,30后270)

回溯:递归时经历的一个过程。

递归:从所需结果出发不断回溯前一运算直到回到初值再递推得到所需结果----从未知到已知,从大到小,再从小到大(你想进bat,那么编程就的牛逼,就得卸载玩者农药,努力学习)。递归(Recursion)是从归纳法(Induction)衍生出来的

一个运算(操作),可以通过不断调用本身的运算形式,往往需要通过前一次的结果来得到当前运算的结果,因而,程序运行时,总是先一次次地「回溯」前一次的结果(回溯过程中这些结果是未知的,直到回溯到初值令回溯终止,再层层递推回来得到当前要求的值)

一个完整的递归应该有下面三个条件,否则就是不合格的递归

  1. 明确递归的终止方法(一个递归必须有他递推到头的界定,否则将会是无限递归 )
  2. 明确的终止时处理方法
  3. 重复调用自身并缩小问题规模

死循环不会栈溢出而无限递归会出现栈溢出情况,详情推荐阅读:《递归-程序之美,及其与循环的区别》,但实际上业务模型几乎不会遇到。

kidneyball知乎回答总结会精辟

在有循环的语言里,有的人认为尾递归优化除了炫技之外是完全无用的。其实不然,尾递归写法在我看来有以下好处

  1. 强迫你把循环写成单独的函数。这又有什么好处呢?这会影响你的编程风格,习惯使用尾递归之后,你的写出一个几百行大函数的机率会小得多。
  2. 保证没有副作用,统一使用不可变数据。在循环里,循环变量就是一个可变数据。作为人肉开发者,如果想保证自己的某段程序没有副作用,最好的做法就是根本不要写任何带副作用的东西,这样代码审查时一眼看过去就能知道有没有副作用。至于避免副作用有什么好处,这又可以写一篇文章,这里就不展开了。
  3. 转换成惰性序列时比较好看。在某些语言里,尾递归形式基本上只要去掉循环变量(变成无限递归), 把初始状态作为首元素,就是一个能直接拿来用的惰性序列。

“递归”是一种思路,这种思路的特点是:我不关注问题本身,我只关注这个问题如何可以用一种可重复的方式分解为一些规模更小的子问题,以及这些子问题与原问题的关系。再加上当问题的规模足够小的时候,存在一个简单直接的解法。

递推和递归还是迷糊,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;
}

不难看出,

程序的一般写法就好比是数列的通项公式。
程序的递归写法就好比是数列的递推公式。

原文链接:再谈循环&迭代&回溯&递归&递推这些基本概念 - 模型设计,领域设计,软件设计, - 周陆军的个人网站,不定时更新,文有不妥之处,请留言告知,多谢(再谈系列多为总结性文章(搬砖凑))。

推荐文章:

程序员们,以后再也别问我递归的问题了

递归-程序之美,及其与循环的区别

原文地址:https://www.cnblogs.com/zhoulujun/p/10800315.html

时间: 2024-10-18 11:20:41

再谈循环&迭代&回溯&递归&递推这些基本概念的相关文章

BZOJ 4204 取球游戏 循环矩阵优化期望递推

题意:链接 方法:循环矩阵优化期望递推. 解析: 这题递推没啥,主要是循环矩阵优化 我们发现,如果直接上矩阵优化的话是n^3log,所以铁定是过不了了的,然后再观察一下这道题我们要求幂的矩阵,发现他是这种形式 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 每一行都是上一行向右窜了一位 所以我们可以用一个一维数组代表这个循环矩阵 并且循环矩阵求和,乘积还是循环矩阵 所以我们就可以用循环矩阵来优化掉一个n 复杂度即变为了n^2log 可过. 代码

函数递归 - 递推与回溯 练习题

递归与二分法习题二分法就是在按照从大到小或者从小到大规律排布的列表中,寻找的值通过与中间的值比较大小,从而对列表进行操作,然后再比较的循环过程. 用递归的方法找出列表中的值num = [1,3,4,5,6,8,22,33,55,778,990]def search(search_number,num): if len(num) == 0:return mid = len(num) // 2 mid_nums = num[len(num)//2] if search_number > mid_nu

递归--递推之组合数

排列在上一篇中已经写到,是个典型的深搜题,下面是介绍的组合数, 组合的基本定义是, 但是除了用这种传统的方法来求,可以用递归的方式或者是递推的方式来求, 说道递推,只要会递归, 就会递推了.关键的一部是递推式,可以定义一个函数func(int n, int k); 表示求的值,公式先放在这func(n, k) = func(n-1, k-1)+func(n-1,k); 意思就是在n中选去k个数的组合一个多少个,这时就要分两种情况, 一种是选出一组数中包含最后一个元素,它的值就是func(n -

POJ-1163-The Triangle: DP入门 递归 递推

递归思路 超时算法 #include<iostream> using namespace std; #define Size 101 int Triangle[Size][Size]; int n; int GetAns( int i, int j ) { if( i==n ) return Triangle[i][j]; int x=GetAns( i+1, j ); int y=GetAns( i+1, j+1 ); return max(x, y)+Triangle[i][j]; } i

【Java】课后动手动脑及递归递推的应用

1.代码 表示方法为静态方法,在其它类中可以直接通过类名去调用这个方法! 例如public static void main(String[] args){ClassName.prt("abc");}如果不加static,则只有通过该类的对象去调用.例如public static void main(String[] args){ClassName name=new ClassName();name.prt("abc");} 2.线性同余纯随机数生成器 3.代码 4

如何使用循环而不是递归反推的方式实现拓展欧几里德算法

平常我们使用拓展欧几里德算法求pm + qn = gcd(m, n)这种表示时,一般都会选择递归的方式来实现,因为欧几里得算法的递归深度最多也只有O(lgn), according to lame's theorem,所以这个递归用栈是可以忽略的. 但其实只需要循环就可以求出一组pm + qn = gcd(m, n)的表示,将栈深度保持在O(1),这样的写法在使用函数调用的高级语言中看起来复杂一点但在汇编编程时就显得比较简单. 方法是假设第k次迭代中的两个数分别为 M(k) 和 N(k),我们始

斐波那契数列数组递归递推的时间空间复杂度的分析

3g0gpapcgj傅节涤澳浩日换崭睹速<http://weibo.com/p/230927987595257304584192> nfdc5g6tss谅渍狙庇淤律臼忠圆账<http://weibo.com/p/230927987596255930617856> 2kvbhyaba6棠妨睦阶月忧杜懊猎茄<http://weibo.com/p/230927987595884084596736> iw27choola戮鸵垦呀粟傧段厍刀推<http://weibo.co

递推方程的求解

递推方程的求解 其实这是本人<算法设计与分析>课程回顾的内容整理,用来测试一下cnblogs上的markdown和数学公式支持...... 什么是递推方程? 对于序列\(a_0,a_1,a_2, -,a_n\),简记为\({a_n }\),一个把\(a_n\)与若干个\(a_i (i<n)\)联系在一起的等式叫做关于序列\({a_n}\)的递推方程. 为什么要学习求解递推方程? 因为对递归算法的分析离不开递推方程的求解 例如,Hanoi塔问题递归算法为: Hanoi(A, C, n):

HDU 1143 Tri Tiling (递推)

Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2118    Accepted Submission(s): 1211 Problem Description In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sa