发布网友 发布时间:2022-04-23 10:01
共5个回答
热心网友 时间:2023-10-10 15:16
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无*地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
例如,下列为某人祖先的递归定义:
某人的双亲是他的祖先(基本情况)。某人祖先的双亲同样是某人的祖先(递归步骤)。斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21..... I[1]
斐波纳契数列是典型的递归案例:
递归关系就是实体自己和自己建立关系。
Fib(0) = 1 [基本情况] Fib(1) = 1 [基本情况] 对所有n > 1的整数:Fib(n) = (Fib(n-1) + Fib(n-2)) [递归定义] 尽管有许多数学函数均可以递归表示,但在实际应用中,递归定义的高开销往往会让人望而却步。例如:
阶乘(1) = 1 [基本情况] 对所有n > 1的整数:阶乘(n) = (n * 阶乘(n-1)) [递归定义] 一种便于理解的心理模型,是认为递归定义对对象的定义是按照“先前定义的”同类对象来定义的。例如:你怎样才能移动100个箱子?答案:你首先移动一个箱子,并记下它移动到的位置,然后再去解决较小的问题:你怎样才能移动99个箱子?最终,你的问题将变为怎样移动一个箱子,而这时你已经知道该怎么做的。
如此的定义在数学中十分常见。例如,集合论对自然数的正式定义是:1是一个自然数,每个自然数都有一个后继,这一个后继也是自然数。
德罗斯特效应
德罗斯特效应是递归的一种视觉形式。图中女性手持的物体中有一幅她本人手持同一物体的小图片,进而小图片中还有更小的一幅她手持同一物体的图片,依此类推。
又例如,我们在两面相对的镜子之间放一根正在燃烧的蜡烛,我们会从其中一面镜子里看到一根蜡烛,蜡烛后面又有一面镜子,镜子里面又有一根蜡烛……这也是递归的表现。
热心网友 时间:2023-10-10 15:16
要理解递归,你要有比较强的逻辑能力与数学能力。
你的代码是阶乘,数学定义 f(n)=n*f(n-1),写成代码就是
return n*f(n-1);
至于怎么从代码里理解递归,有时是很困难的。一般来说,你要理解子问题,再理解子问题与略大一点的问题的关系,即理解f(n-1)是什么,f(n-1)怎么变换成f(n)的。理解了这一层,就把递归
热心网友 时间:2023-10-10 15:17
其实递归并不难,只要你把每次递归调用都当作外部调用一样理解就不会太费神。
这个递归函数中的n是会变的,每次递归调用,n的值都是上一层中的n值减1{因为有ff(n-1)}
热心网友 时间:2023-10-10 15:17
不考虑特例(即ff的参数为0/1的时候),执行的过程是这样的:
调用ff(n-1)
调用ff(n-2)
调用ff(n-3)
...
...
ff(n-3)返回
ff(n-2)返回
ff(n-1)返回
应该能看明白吧?
热心网友 时间:2023-10-10 15:18
就是自己调用自己的函数。
切记不要想的太深了,那样你就会很吠声的。