什么叫递归,和迭代?

什么叫递归,和迭代?,第1张

一、含义不同:

递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。

递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。

二、结构不同:

递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。 递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。

递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止,使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。

递归算法一般用于解决三类问题:

(1)数据的定义是按递归定义的。(Fibonacci函数)

(2)问题解法按递归算法实现。

这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。

(3)数据的结构形式是按递归定义的。

如二叉树、广义表等,由于结构本身固有的递归特性,则它们的 *** 作可递归地描述。

百度百科-递归

首先,什么叫做左递归呢? 一个左递归的语法通常有这样的形式 : A-> Aa 而自顶向下的语法分析是无法处理左递归语法的。为什么呢?无论是递归分析还是预测分析或者是LL文法分析,在碰到左递归这种语法时都会陷入死循环当中。如果我们用递归分析,那么在分析A这个非终结符号的时候就会调用functionA,functionA将A分解成A,a,然后在我们再次碰到A的时候又会调用functionA,这样便形成了无限递归。如果我们用非递归的LL文法分析,那么在我们将把A->Aa无限次地压入到栈中,即每次d出A都会压入Aa。所以我们必须采取手段消除左递归,下面给出标准方法。
其中β1…βn 不是从A开始
其实原理在于通过转换将A的语法不从非终结符号(A本身)开始,而是从终结符号β1…βn 开始。虽然A的原语法是从A本身开始的,但是第一个符号一定是β1…βn中的一个,而不可能是任何一个α。所以我们通过一个中间变量A’来表示剩下的α,然而不要忘记由于A’ ->αA’ 这条规则,A’ -> ε 必须也存在于语法规则中,否则末尾将无法匹配完成。
但是,上述方法只适用于立即左递归,还有一种更隐蔽的非立即左递归,如 S -> Aa | b , A -> Sc | d ,我们如果用自顶向下的分析方法会陷入 S -> Aa -> Sca 这样的死循环中。当然,也有相应的解决办法。
将所有非终端符号以某个固定的顺序A_1, \ldots A_n排列
从 i = 1 到 n {
从 j = 1 到 i – 1 {
设A_j的生成规则为
A_j \rightarrow \delta_1 | \ldots | \delta_k
将所有规则 A_i \rightarrow A_j \gamma换成
A_i \rightarrow \delta_1\gamma | \ldots | \delta_k\gamma
移除A_i规则中的直接左递归
}
}
也许看上面的规则过于抽象,我们用S -> Aa | b , A -> Sc | d 来实践一下上述的方法。我们以S,A的顺序排列。则只需执行一次主程序体,且Ai 为A,Aj为S。则:
A -> Aac | bc | d, 然后再运用前面的规则消除直接左递归可得:A -> bcA’ | dA’ , A’ -> acA’ | ε
请注意,以上的解决方案是基于右递归的文法,并不是完全适用于所有的情况。我们得到的文法可能含有 ε表达式,并且可能会改变语法的结合律。解决方案就是保留左递归的语法,不用自顶向下的方式分析。

可能一看到递归查询这样太专业的名词大家就迷糊了实际上可以看成有一个树形结构,然后我们要怎么把所有树的所有结点查找出来学数据结构的时候我们知道要遍历一个树结构有啥前序遍历,中序遍历,后序遍历反正挺麻烦的不像遍历个数组那么容易的那实际上在Oracle的一个表中也可以保存树形结构信息你要查询所有的树节点,自己整个函数或存储过程去整肯定是超级麻烦的Oracle提供了一个简单的机制帮助你要用到start with connect by等关键字先来假定有下面这样一个简单的树形结构存储在表中

1、递归算法概念:
在函数或子过程的内部,直接或者间接地调用自己的算法。
2、基本信息:
递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数或过程来表示问题的解。一个过程或函数直接或间接调用自己本身,这种过程或函数叫递归过程或函数。

删除不好做,因为你是一个文件内容的删除。
可以用字符串数组来保存每一行的值,删除了之后,再重新保存进去。
可以这样做:比如说你的文件路径:c:/atxt
1File file = new File("c:/atxt");
2BufferedReader reader = new BufferedReader(file);
3byte[] strValue = new byte[(int)filelength()];
4String str = readerread(strValue);//按文件大小一次读入
5String rows = strsplit("\r\n");//按换行符拆分,即数组的每一条,对应文件每一行的内容。
6如果要删除按条件删除某一行,只需要判断字符串数组是否存在这一行了,如果存在,替换为“”即可。
7Writer writer = new FileWriter(file);
8
for(int i=0;i<rowslength;i++){
writerwrite(rows[i]);
}
只是分析了一下,具体步骤还是你来完成了。。
RandomAccessFile raf = new RandomAccess("wenjiantxt");
char ch[] = new char[3];
char to[] = ;
boolean get = false;
while(get){
rafreadChars(ch);
if(ch[0]=='d' && ch[1]=='d' && ch[2]=='s'){
get = true;
}
}
rafseek(rafgetFilePointer() -6 );
rafwriteChars(to);
这个代码就是把wenjiantxt中出现的第一个dds修改成ssx。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12945119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存