回溯和尾递归

作者: 张腾飞_三月 | 来源:发表于2018-08-12 16:16 被阅读6次

        最近,了解回溯的算法思想。

        个人认为,回溯的核心思想就是,类似枚举的,把所有的可能情况都遍历一遍,进行试探,在递归当中夹杂一些特定的判断,进行筛选,解决问题。再设计递归出口(回溯点),再回溯回来的时候,把原来改变的状态,改变过来。保持原样。

public static void numergodic(char [] data, int k)

{     

if(k == data.length){                                          // 回溯点

s = String.valueOf(data);                                  //把字符数组转化为字符串

set.add(s);

}

for(int i = k; i < data.length; i++){                          // k表示 当前要交换的位置,从第K个一直交换到最后一个

{ char t = data[k]; data[k] = data[i]; data[i] = t; }      // 试探

numergodic(data,k+1);

{ char t = data[k]; data[k] = data[i]; data[i] = t; }      // 回溯回来

}

}

       至于,尾递归呢。当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。编译器可以做到这点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时,栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。前提是函数的结束部位返回结果。然后,把本次调用函数计算出来的结果值,传给下一次调用的函数。这样写,不会造成栈的溢出(理论上)。但是目前,很多编程语言,对于尾递归还是没有优化,会造成栈的溢出。

        线性递归:

对于线性递归, 它的递归过程如下:

Rescuvie(5)

{5 * Rescuvie(4)}

{5 * {4 * Rescuvie(3)}}

{5 * {4 * {3 * Rescuvie(2)}}}

{5 * {4 * {3 * {2 * Rescuvie(1)}}}}

{5 * {4 * {3 * {2 * 1}}}}

{5 * {4 * {3 * 2}}}

{5 * {4 * 6}}

{5 * 24}

120

        尾递归:

对于尾递归, 它的递归过程如下:

TailRescuvie(5)

TailRescuvie(5, 1)

TailRescuvie(4, 5)

TailRescuvie(3, 20)

TailRescuvie(2, 60)

TailRescuvie(1, 120)

120

相关文章

  • 回溯和尾递归

    最近,了解回溯的算法思想。 个人认为,回溯的核心思想就是,类似枚举的,把所有的可能情况都遍历一遍,...

  • 8.30 leetcode刷题(2)

    递归和回溯:17 电话号码 思路:运用递归去实现回溯算法的思想。回溯算法本质上是一种暴力搜索,通过递归调用去实现,...

  • 二叉树算法之0-计算二叉树的深度

    算法思想:使用递归 算法解析:分别递归左树和右树,递归到叶子节点时返回0,递归回溯时值+1,不断累积回溯的深度,每...

  • 递归、迭代、回溯、广度和深度优先

    在学习算法的时候,经常碰到递归、迭代、回溯、广度优先和深度优先算法,可是回溯使用了递归,深度优先也使用了递归,广度...

  • 递归和尾递归

    作者:匿名用户 链接:https://www.zhihu.com/question/20761771/answer...

  • 递归和尾递归

    递归(recursion) 递归指函数体中直接或间接调用自身的一种方法,递归的解决思路通常是把一个大问题转化为许多...

  • 递归和尾递归

    原文 递归原理 递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用 你可能想知道如何实现调用自身...

  • 递归2-回溯与递归

    I. 回溯算法基础 回溯与递归的区别和联系  很多人不理解回溯与递归到底是什么关系。其实很简单,回溯算法是一种算法...

  • 8.分治、回溯的实现与特性

    前言 分治与回溯,其实本质上就是递归,只不过它是递归的其中一个细分类。你可以认为分治和回溯最后就是一种特殊的递归,...

  • LeetCode之回溯算法

    回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。因为回溯的本质是穷举,穷...

网友评论

    本文标题:回溯和尾递归

    本文链接:https://www.haomeiwen.com/subject/oovsbftx.html