5.5递归算法实例及程序实现

合集下载

递归算法及经典例题详解

递归算法及经典例题详解

递归算法及经典例题详解
1.什么是递归
递归简单来说就是在运行过程中不断调用自己,直到碰到终止条件,返回结果的过程。

递归可以看作两个过程,分别是递和归。

递就是原问题把要计算的结果传给子问题;归则是子问题求出结果后,把结果层层返回原问题的过程。

下面设一个需要经过三次递归的问题,为大家详细看一下递归的过程:当然,现实中我们遇到递归问题是不会按照图中一样一步一步想下来,主要还是要掌握递归的思想,找到每个问题中的规律。

2.什么时候使用递归
递归算法无外乎就是以下三点:1.大问题可以拆分为若干小问题2.原问题与子问题除数据规模不同,求解思路完全相同3.存在递归终止条件
而在实际面对递归问题时,我们还需要考虑第四点:
当不满足终止条件时,要如何缩小函数值并让其进入
下一层循环中
3.递归的实际运用(阶层计算)
了解了大概的思路,现在就要开始实战了。

下面我们来看一道经典例题:
求N的阶层。

首先按照思路分析是否可以使用递归算法:
1.N!可以拆分为(N-1)!*N
2.(N-1)!与N!只有数字规模不同,求解思路相同
3.当N=1时,结果为1,递归终止
满足条件,可以递归:
publicstaticintFactorial(int num){if(num==1){return num;}return num*Factorial(num-1);}
而最后的return,便是第四步,缩小参数num的值,让递归进入下一层。

一般来说,第四步往往是最难的,需要弄清该如何缩
小范围,如何操作返回的数值,这一步只能通过不断
地练习提高了(当然如果你知道问题的数学规律也是
可以试出来的)。

递归算法实现

递归算法实现

递归算法实现递归算法是一种常用的问题求解方法,它将一个问题分解为相同类型的子问题,并通过解决这些子问题来解决原始问题。

递归算法的实现通常使用函数的递归调用来实现。

递归算法的实现可以分为两个步骤:基本情况和递归情况。

基本情况是指当问题达到某个简单的条件时,直接返回结果。

递归情况是指通过调用自身来解决规模较小的子问题,并将子问题的结果合并为原始问题的解。

在实现递归算法时,我们需要考虑以下几个方面:1. 确定基本情况:递归算法必须有一个或多个基本情况,即递归的终止条件。

在基本情况下,问题已经足够简单,可以直接返回结果,而不需要再进行递归调用。

2. 确定递归情况:递归算法必须能够将原始问题分解为规模更小的子问题,并通过递归调用来解决这些子问题。

递归情况的实现需要考虑如何将问题分解,以及如何将子问题的结果合并为原始问题的解。

3. 确定递归调用:递归算法的实现中,需要调用自身来解决子问题。

递归调用的位置和参数需要根据具体问题来确定。

递归调用的过程中,问题的规模应该不断减小,直到达到基本情况。

例如,我们可以使用递归算法来计算斐波那契数列。

斐波那契数列是一个数列,第一个和第二个数字都是1,从第三个数字开始,每个数字都是前两个数字之和。

在实现斐波那契数列的递归算法中,我们可以将问题分解为计算前两个数字的和。

如果要计算第n个斐波那契数,我们需要计算第n-1个和第n-2个斐波那契数的和。

这样,问题的规模不断减小,直到达到基本情况。

下面是一个用Python实现斐波那契数列的递归算法的例子:```pythondef fibonacci(n):if n <= 0:return "输入有误"elif n == 1 or n == 2:return 1else:return fibonacci(n-1) + fibonacci(n-2)```在这个例子中,我们首先判断输入是否合法,如果n小于等于0,则返回错误信息。

递归算法及经典递归例子代码实现

递归算法及经典递归例子代码实现

递归算法及经典递归例子代码实现递归算法是一种在函数体内调用函数本身的算法。

通过递归,问题可以被分解为规模更小的子问题,直到达到基本情况,然后将所有的子问题的解合并起来,得到原始问题的解。

递归算法的实现通常包含两个要素:基本情况和递归调用。

基本情况是指不能再进一步分解的情况,一般是针对问题的最小输入。

递归调用是指在解决子问题之后,将问题规模缩小,然后调用自身来解决更小规模的问题。

下面将介绍三个经典的递归例子,并给出相应的代码实现。

1.阶乘计算:阶乘是指从1到给定的数字n之间所有整数的乘积。

它是递归问题的经典例子之一```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)```在阶乘的递归实现中,基本情况是n等于0时,返回1、递归调用是将问题规模变为n-1,然后将得到的结果与n相乘。

通过递归调用,可以一直计算到n为1,然后将每个阶乘结果逐步合并返回,最终得到n的阶乘。

2.斐波那契数列:斐波那契数列是指从0和1开始,后续的数字都是前两个数字之和。

```pythondef fib(n):if n <= 0:return 0elif n == 1:return 1else:return fib(n - 1) + fib(n - 2)```在斐波那契数列的递归实现中,基本情况是n小于等于0时返回0,n等于1时返回1、递归调用是将问题规模分为两个子问题,分别计算n-1和n-2的斐波那契数,然后将两个子问题的结果相加返回。

通过递归调用,可以一直计算到n为0或1,然后将每个斐波那契数逐步合并返回,最终得到第n个斐波那契数。

3.二叉树遍历:二叉树遍历是指按照一定的顺序访问二叉树的所有节点。

```pythonclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef inorderTraversal(root):if root is None:return []else:return inorderTraversal(root.left) + [root.val] + inorderTraversal(root.right)```在二叉树的中序遍历的递归实现中,基本情况是判断当前节点是否为空,如果为空则返回一个空列表。

离散数学中递归算法的实现方法

离散数学中递归算法的实现方法

离散数学中递归算法的实现方法递归算法是离散数学中一个重要的概念,它在问题求解、数学推理和计算机编程等领域都得到了广泛的应用。

本文将介绍离散数学中递归算法的实现方法,涵盖递归函数的定义、基本思想、应用场景以及注意事项等方面。

一、递归函数的定义递归函数是一种自我调用的函数,它通过将一个大问题分解成一个或多个相同结构的小问题来解决。

递归函数包含两个要素:基本情况和递归情况。

基本情况是递归结束的条件,递归情况是函数调用自身处理子问题。

二、递归算法的基本思想递归算法的基本思想是分而治之,将一个大问题分解成一个或多个规模较小的子问题进行解决。

递归算法适用于可通过不断缩小问题规模来直接获得问题解的情况。

递归算法的实现可以采用自顶向下或自底向上的方式。

三、递归算法的应用场景1. 数学推理:递归算法在公式推导、数列求解和数学归纳等问题中有广泛应用。

例如,斐波那契数列是一个经典的递归数列,可以通过递归算法进行求解。

2. 问题求解:递归算法在问题求解中可以将大问题分解成小问题进行解决。

例如,迷宫问题、八皇后问题等都可以通过递归算法来求解。

3. 数据结构:递归算法在二叉树、图等数据结构的遍历和搜索中得到广泛应用。

例如,二叉树的前序遍历、中序遍历和后序遍历都可以采用递归算法实现。

四、递归算法的实现步骤1. 定义递归函数:根据问题的特点,定义递归函数,并明确函数的输入和输出。

2. 确定基本情况:根据问题的结束条件,确定递归函数的基本情况。

3. 实现递归调用:在递归情况中,将原问题转化为一个或多个子问题,并通过递归调用函数来解决。

4. 合并子问题的解:在递归调用返回后,将子问题的解合并得到原问题的解。

5. 处理边界情况:对于可能出现的边界情况,进行额外的处理。

五、递归算法的注意事项1. 基本情况的正确性:基本情况是递归算法的结束条件,必须确保基本情况的正确性,否则会导致递归无法结束或结果错误。

2. 递归调用的停止条件:递归调用应该能够最终收敛到基本情况,否则会导致死循环或栈溢出等问题。

递归算法详解完整版

递归算法详解完整版

递归算法详解完整版递归算法是一种重要的算法思想,在问题解决中起到了很大的作用。

它通过将一个大问题划分为相同或类似的小问题,并将小问题的解合并起来从而得到大问题的解。

下面我们将详细介绍递归算法的定义、基本原理以及其应用。

首先,我们来定义递归算法。

递归算法是一种通过调用自身解决问题的算法。

它通常包括两个部分:基础案例和递归步骤。

基础案例是指问题可以被直接解决的边界情况,而递归步骤是指将大问题划分为较小问题并通过递归调用自身解决。

递归算法的基本原理是"自顶向下"的思维方式。

即从大问题出发,不断将问题划分为较小的子问题,并解决子问题,直到达到基础案例。

然后将子问题的解合并起来,得到原始问题的解。

递归算法的最大特点是简洁而优雅。

通过将复杂问题分解为简单问题的解决方式,可以大大减少代码的复杂程度,提高程序的效率和可读性。

但是递归算法也有一些缺点,包括递归深度的限制和复杂度的不确定性。

过深的递归调用可能导致栈溢出,而不合理的递归步骤可能导致复杂度过高。

递归算法有许多应用场景,我们来介绍其中一些典型的应用。

1.阶乘问题:计算一个数的阶乘。

递归算法可以通过将问题划分为更小的子问题来解决。

例如,n的阶乘可以定义为n乘以(n-1)的阶乘。

当n 等于1时,我们可以直接返回1作为基础案例。

代码如下:```int factorial(int n)if (n == 1)return 1;}return n * factorial(n - 1);```2.斐波那契数列问题:求斐波那契数列中第n个数的值。

斐波那契数列的定义是前两个数为1,然后从第三个数开始,每个数都是前两个数的和。

递归算法可以通过将问题划分为两个子问题来解决。

当n等于1或2时,直接返回1作为基础案例。

代码如下:```int fibonacci(int n)if (n == 1 , n == 2)return 1;}return fibonacci(n - 1) + fibonacci(n - 2);```3.二叉树问题:对于给定的二叉树,递归算法可以通过递归调用左子树和右子树的解来解决。

递归遍历算法流程图及实例分析

递归遍历算法流程图及实例分析

递归遍历算法流程图及实例分析下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 递归遍历算法流程图开始输入二叉树的根节点如果根节点为空,结束输出根节点的值递归遍历左子树递归遍历右子树结束2. 实例分析假设有如下二叉树:```1/ \2 3/ \ / \4 5 6 7```我们可以使用递归遍历算法来遍历这个二叉树。

Python中的递归算法实现方法

Python中的递归算法实现方法

Python中的递归算法实现方法递归算法是一种非常重要的算法,在编程中起着非常重要的作用。

递归算法是一种解决问题的方法,它通过将问题分解成更小的易于解决的同类问题,从而使得问题的解决更加的简单清晰。

一、递归算法的基本概念递归算法是指在解决问题的过程中,使用自身的解决方法来完成。

通俗的说,就是在解决问题的过程中,不断调用自身,来解决更加复杂的问题。

递归算法分为两个基本部分:基准情况和递归情况。

基准情况是指,在递归过程中最终能够被解决的问题。

而递归情况则是指在递归过程中,需要将问题细分为更小的同类问题,直到最终能够满足基准情况。

二、递归算法的实现方法递归算法的实现方法有很多种,下面我们将介绍其中两种比较常见的实现方法。

1、递归函数实现方法递归函数是实现递归算法的一种常见方法。

递归函数通过调用自身来解决更加复杂的问题。

下面是一个递归函数的实现例子:```def sum(n):if n == 1:return 1else:return n + sum(n - 1)```上面的例子中,我们定义了一个sum函数,这个函数用来计算前n 个自然数的和。

在函数中,我们首先判断n是否等于1,如果n等于1,则说明已经到达基准情况,直接返回1。

如果n不等于1,则调用自身,并将n-1作为参数传入,再将其结果与n相加,最终返回结果。

2、递归过程实现方法递归过程是另一种实现递归算法的方法。

递归过程与递归函数的区别在于,递归过程通常不返回任何值,而是通过改变参数来实现递归。

下面是一个递归过程的实现例子:```def recursion(n, result):if n == 0:returnelse:result.append(n)recursion(n - 1, result)result = []recursion(5, result)print(result)```上面的例子中,我们定义了一个名为recursion的递归过程。

递归算法的实现和应用

递归算法的实现和应用

递归算法的实现和应用递归算法是计算机科学中非常重要的概念之一。

所谓递归,就是一种通过重复调用自身函数或方法,解决问题的方法。

递归算法可以实现很多复杂的操作,例如排序、搜索、图形遍历等,其应用广泛,是计算机领域中一种重要的算法。

一、递归算法的实现递归算法的实现主要分为两个部分,递归基和递归过程。

递归基是指递归中最简单的情况,也就是递归递归到最后一步时可以直接得到结果的情况。

例如,计算一个数的阶乘时,当n=1时,可以直接得到结果 1,这个就是递归基。

递归过程则是指递归函数或方法的具体实现。

递归过程必须符合递归的规则,也就是每次递归必须向递归基靠近。

在递归函数或方法的实现中,通常会使用条件判断或循环语句,通过这些语句的控制,递归过程能够正常执行,最终得到正确的结果。

例如下面是一个计算阶乘的递归实现代码:```def factorial(n):if n == 1:return 1else:return n * factorial(n-1)```上面这个例子中,当 n=1 时,函数返回 1,这就是递归基。

当n 大于 1 时,函数会调用自身,并将 n-1 作为参数传入,这就是递归过程。

这样,每次递归时,问题规模都会减小,直到递归基情况出现,然后递归过程就结束了。

二、递归算法的应用递归算法可以应用于很多算法中,其中包括排序、搜索、遍历等。

1. 排序在排序算法中,递归算法常常被用来实现归并排序和快速排序。

归并排序是一种稳定的排序算法,其时间复杂度为 O(nlogn)。

该算法将待排序数组递归地分成两个子数组,对每个子数组进行排序,然后合并子数组以得到最终结果。

快速排序是另一种常用的排序算法,其时间复杂度为 O(nlogn) 或 O(n²),其递归过程较于归并排序更为简单。

2. 搜索在搜索算法中,递归算法被使用在深度优先搜索和广度优先搜索中。

深度优先搜索是一种搜索算法,从根节点出发,依次访问各个节点,并一直深入直到找到目标节点或遍历完整个图。

递归算法及程序实现

递归算法及程序实现

递归算法及程序实现递归算法是一种在函数中调用自身的算法。

递归算法通常用于解决可以分解为相同问题的问题,每次递归调用将问题划分为更小的子问题。

递归算法包含两个重要的部分:基本情况和递归情况。

基本情况是递归算法中结束递归的条件。

当递归到达基本情况时,算法将停止递归,并返回结果。

递归情况是递归算法中的循环调用部分,通过调用自身并传递更小的子问题来解决原始问题。

递归情况通常将问题缩小,直到达到基本情况。

下面以一个常见的例子来说明递归算法及其实现方法:求解阶乘。

阶乘是指将一个自然数N连乘,即N!=N*(N-1)*(N-2)*...*2*1、阶乘是一个常见的数学计算,可以使用递归算法来解决。

首先,定义一个递归函数,命名为factorial,它接受一个整数作为参数,并返回该整数的阶乘。

```pythondef factorial(n):if n == 1:return 1else:return n * factorial(n-1)```在这个递归函数中,有两种情况。

当n等于1时,递归到达基本情况,函数返回1、否则,递归调用自身,并将n减1传递给函数。

每次递归调用都会将问题缩小,直到达到基本情况。

接下来,可以使用这个递归函数来计算任意整数的阶乘。

例如,计算5的阶乘,可以调用factorial函数:```pythonresult = factorial(5)print(result) # 输出结果120```在这个例子中,求解5的阶乘需要进行5次递归调用,即factorial(5) -> factorial(4) -> factorial(3) -> factorial(2) -> factorial(1)。

最终,递归到达基本情况,返回1,并依次完成阶乘的乘法运算。

值得注意的是,递归算法需要考虑递归深度的问题。

如果递归深度过大,可能导致栈溢出或性能下降。

因此,在编写递归算法时,需要仔细考虑递归深度和算法的效率。

递归算法及其案例用途

递归算法及其案例用途

递归算法及其案例⽤途递归(recursive)算法是⼀种循环调⽤⾃⾝来解决问题的思想,这是⼀中⽐较神奇的⽅法,你只要能⼝述循环调⽤过程,然后设定好基础情况(什么时候开始、什么时候结束),基本根据描述就可以将思路转换成代码,递归算法有以下条件组成:1、递归开始和结束的基本条件(base case)2、每次执⾏需要循环调⽤⾃⼰(也就是找出递归⽅程),每次调⽤⾃⼰时,执⾏内容都要向基本条件靠拢,直⾄满⾜并跳出基本条件所以递归定义很重要的⼀点就是要定义好跳出递归的基本条件,否则极易引起死循环,进去后就出不来,拿⼀个最简单的故事作为例⼦来说:从前有个庙,庙⾥有个⽼和尚和⼀个⼩和尚,⽼和尚对⼩和尚说:从前有个庙,庙⾥有个⽼和尚和⼀个⼩和尚,⽼和尚对⼩和尚说......这个故事也是⼀个递归,但是是⼀个死的递归,因为没有结束的基本条件,故事开始后⽼和尚会⼀直重复将这个故事,结果可想⽽知,如果是⼈的话,则⽼和尚会被累死故事才能结束,如果是计算机,则程序爆掉了执⾏才能结束,但是如果有结束条件的话就可以避免这种情况发⽣,⽐如⽼和尚事先对⼩和尚说好,这个故事只能讲两遍,那当⽼和尚讲完第⼆遍后⾃动结束讲述,程序也就⾄此结束了。

递归算法案例分析:1、求解斐波那契数(Fibonacci number)斐波那契数就是斐波那契数列中的数,斐波那契数的定义是:f(n)=f(n-1)+f(n-2),基本条件是f(n)=n (n<=1)根据描述,可以定义函数:def fibonacci(n): if(n<=1) return n; // 定义结束条件,这时候不能再调⽤⾃⼰了 return fibonacci(n-1)+fibonacci(n-2); // 递归⽅程,调⽤⾃⼰⽅法定义完毕,可以求解fibonacci(n),当n=1时,fibonacci(1)=1,递归带⼊,可以求出fibonacci(3)=2,fibonacci(10)=55 2、移动汉诺塔汉诺塔是有三根柱⼦,假定是a,b,c,其中a柱⼦上有n个圆盘,下层的盘要⽐上⼀层的⼤,需要将这n个盘从a通过b柱⼦移动到c。

python的递归算法

python的递归算法

python的递归算法Python是一种高级编程语言,它支持递归算法。

递归算法是一种解决问题的方法,它通过将问题分解为更小的子问题来解决问题。

在Python中,递归算法可以使用函数来实现。

递归算法的基本思想是将一个大问题分解为更小的子问题,然后通过解决子问题来解决原始问题。

递归算法通常使用函数来实现。

在Python中,函数可以调用自身,这使得递归算法的实现变得非常容易。

递归算法的实现通常包括两个部分:基本情况和递归情况。

基本情况是指问题已经被分解为最小的子问题,可以直接解决。

递归情况是指问题仍然需要被分解为更小的子问题,然后通过递归调用函数来解决。

下面是一个简单的递归算法的例子,它计算一个数的阶乘:```def factorial(n):if n == 0:return 1else:return n * factorial(n-1)```在这个例子中,函数factorial()计算一个数的阶乘。

如果n等于0,函数返回1,这是基本情况。

否则,函数返回n乘以factorial(n-1),这是递归情况。

函数factorial()调用自身来计算n-1的阶乘,直到n等于0为止。

递归算法的优点是它可以使代码更简洁、更易于理解。

递归算法的缺点是它可能会导致栈溢出,因为每次递归调用都会在栈上创建一个新的函数调用帧。

为了避免栈溢出,可以使用尾递归优化或迭代算法来实现递归算法。

尾递归优化是一种将递归算法转换为迭代算法的技术。

在尾递归优化中,递归调用是函数的最后一个操作,这使得编译器可以将递归算法转换为迭代算法。

在Python中,尾递归优化通常不被支持,因为Python解释器不支持尾递归优化。

迭代算法是一种使用循环来解决问题的方法。

迭代算法通常比递归算法更快,因为它不需要在栈上创建新的函数调用帧。

在Python中,可以使用循环来实现迭代算法。

总之,Python支持递归算法,递归算法是一种解决问题的方法,它通过将问题分解为更小的子问题来解决问题。

递归算法实现

递归算法实现

递归算法实现递归算法是一种常见的算法思想,它在解决问题时将问题分解为规模更小的子问题,然后通过解决子问题来解决原始问题。

递归算法的实现可以在程序中实现函数的自我调用,通过不断地调用自身来解决问题。

递归算法的实现需要遵循一定的规则和原则。

首先,需要确定递归算法的终止条件,即确定何时可以不再调用自身而直接返回结果。

其次,需要确定递归算法的递推关系,即通过解决子问题来解决原始问题的方法。

最后,需要确定递归算法的边界条件,即确定每次递归调用时问题规模的变化情况。

递归算法可以应用于各种问题的解决中。

例如,可以使用递归算法来实现阶乘计算。

阶乘是指从1到给定整数n之间所有整数的乘积。

可以通过将问题分解为更小的子问题来实现阶乘计算的递归算法。

具体而言,可以将n的阶乘表示为n乘以(n-1)的阶乘,再通过递归调用计算(n-1)的阶乘来实现。

另一个例子是使用递归算法来实现斐波那契数列的计算。

斐波那契数列是一个以0和1开始的数列,后面的每一项都是前两项的和。

可以通过将问题分解为两个子问题来实现斐波那契数列的递归算法。

具体而言,可以将第n项的计算表示为第(n-1)项和第(n-2)项的和,再通过递归调用计算两个子问题来实现。

除了数学问题,递归算法还可以应用于其他领域。

例如,在计算机科学中,递归算法可以用来遍历树形结构或图形结构。

通过递归调用来实现对树或图的遍历,可以更简洁地表达算法逻辑,同时也提高了代码的复用性和可读性。

然而,递归算法也存在一些问题和注意事项。

首先,递归算法的效率可能较低,因为它可能会进行大量的重复计算。

为了解决这个问题,可以使用记忆化搜索等技术来优化递归算法。

其次,递归算法可能会导致栈溢出的问题,因为每次递归调用都会在系统栈中增加一层函数调用。

为了解决这个问题,可以使用尾递归优化等技术来减少栈空间的使用。

递归算法是一种常见的算法思想,通过将问题分解为更小的子问题来解决原始问题。

递归算法的实现需要遵循一定的规则和原则,同时也需要注意一些问题和注意事项。

递归算法的执行过程

递归算法的执行过程

递归算法的执行过程
嘿,咱今天就来讲讲那个神奇的递归算法的执行过程。

就拿我以前收拾房间来举个例子吧。

比如说我要把整个房间整理干净,这就像是一个大任务。

我先从整理书桌开始,把书桌上的东西摆放整齐,这就算是完成了一个小步骤。

但书桌整理好了,我发现旁边的书架也有点乱,那我又得去整理书架,这就好像是在大任务里又出现了一个新的小任务。

等把书架整理好,可能又看到地上有几本书,那我还得去把书捡起来放好,这又是一个新的小环节。

这就跟递归算法一样,不断地在一个大问题里发现小问题,然后一个一个地去解决。

在递归算法里,它会不断地深入下去,解决一个又一个的子问题,就像我收拾房间,解决了一个小地方的问题,又会引出其他相关的小问题要去处理。

有时候感觉就像是掉进了一个无底洞,一直不停地在处理各种细节。

但神奇的是,最终它总能找到出路,把整个大任务都完成得妥妥当当。

总之呢,递归算法就是这样一个有趣又有点让人头疼的东西,就像我收拾房间一样,看似简单,却有着很多层的步骤和细节需要去慢慢处理。

这就是递归算法的执行过程啦,是不是挺有意思的呀!。

递归算法及经典递归例子代码实现

递归算法及经典递归例子代码实现

递归算法及经典递归例⼦代码实现递归(recursion):程序调⽤⾃⾝的编程技巧。

递归满⾜2个条件:1)有反复执⾏的过程(调⽤⾃⾝)2)有跳出反复执⾏过程的条件(递归出⼝)递归例⼦:(1)阶乘n! = n * (n-1) * (n-2) * ...* 1(n>0)//阶乘int recursive(int i){int sum = 0;if (0 == i)return (1);elsesum = i * recursive(i-1);return sum;}(2)河内塔问题//河内塔void hanoi(int n,int p1,int p2,int p3){if(1==n)cout<<"盘⼦从"<<p1<<"移到"<<p3<<endl;else{hanoi(n-1,p1,p3,p2);cout<<"盘⼦从"<<p1<<"移到"<<p3<<endl;hanoi(n-1,p2,p1,p3);}}(3)全排列从n个不同元素中任取m(m≤n)个元素,按照⼀定的顺序排列起来,叫做从n个不同元素中取出m个元素的⼀个排列。

当m=n时所有的排列情况叫全排列。

如1,2,3三个元素的全排列为:1,2,31,3,22,1,32,3,13,1,23,2,1//全排列inline void Swap(int &a,int &b){int temp=a;a=b;b=temp;}void Perm(int list[],int k,int m){if (k == m-1){for(int i=0;i<m;i++){printf("%d",list[i]);}printf("n");}else{for(int i=k;i<m;i++){Swap(list[k],list[i]);Perm(list,k+1,m);Swap(list[k],list[i]);}}}(4)斐波那契数列斐波纳契数列,⼜称黄⾦分割数列,指的是这样⼀个数列:1、1、2、3、5、8、13、21、……这个数列从第三项开始,每⼀项都等于前两项之和。

c语言递归算法经典实例

c语言递归算法经典实例

c语言递归算法经典实例递归算法是计算机科学中的重要概念,也是C语言编程中常用的技术手段之一。

它可以用于解决各种问题,包括数学、图形、排序、搜索等领域。

在本文中,我们将以中括号内的内容为主题,详细介绍C语言递归算法的经典实例,并逐步回答一些相关问题。

首先,让我们从递归算法的定义开始。

递归算法是一种通过将问题分解为更小的子问题来解决问题的方法。

在使用递归算法时,我们首先解决最小的问题,然后逐步解决更大的问题,直到最终解决整个问题。

这种分而治之的思想是递归算法的核心。

接下来,让我们以斐波那契数列为例,详细介绍递归算法的应用。

斐波那契数列是一个经典的数学问题,其中每个数字都是前两个数字之和。

例如,序列的前几个数是1、1、2、3、5、8、...。

我们可以使用递归算法来计算斐波那契数列中的任意项。

首先,我们定义一个函数fibonacci,用来计算斐波那契数列中的第n项。

函数的定义如下:cint fibonacci(int n) {if (n <= 1) {return n;} else {return fibonacci(n-1) + fibonacci(n-2);}}在这个函数中,我们首先检查n是否小于或等于1。

如果小于或等于1,则直接返回n作为结果。

否则,我们通过递归调用fibonacci函数来计算n-1和n-2两个子问题的解,然后将它们相加。

接下来,让我们回答第一个问题:如何使用递归算法计算斐波那契数列的第n项?我们可以通过调用fibonacci函数来计算斐波那契数列中的第n项。

例如,要计算第10项的值,我们可以使用以下代码:cint result = fibonacci(10);printf("第10项的值是:d\n", result);这将打印出“第10项的值是:55”,因为斐波那契数列的第10项是55。

接下来,让我们回答第二个问题:递归算法如何工作?当我们调用fibonacci函数时,它会检查传递给它的参数n的值。

递归算法及经典递归例子代码实现

递归算法及经典递归例子代码实现

⑴按顺时针方向把圆盘 1 从现在的柱子移动到下一根柱子,即 当 n 为偶数时,若圆盘 1 在柱子 A,则把它移动到 B;若圆盘 1 在 柱子 B,则把它移动到 C;若圆盘 1 在柱子 C,则把它移动到 A。 ⑵接着,把另外两根柱子上可以移动的圆盘移动到新的柱子 上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空 时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能 以为会有多种可能性,其实不然,可实施的行动是唯一的。 ⑶反复进行⑴⑵操作,最后就能按规定完成汉诺塔的移动。 所以结果非常简单,就是按照移动规则向一个方向移动金片: 如 3 阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→ C 汉诺塔问题也是程序设计中的经典递归问题,下面我们将给出 递归和非递归的不同实现源代码。
public static Integer recursionMulity(Integer n){ if(n==1){ return 1; } return n*recursionMulity(n-1); }
(三)河内塔问题
ቤተ መጻሕፍቲ ባይዱ
1)分析
有三根相邻的柱子,标号为 A,B,C,A 柱子上从下到上按金字 塔状叠放着 n 个不同大小的圆盘,要把所有盘子一个一个移动到柱 子 B 上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上 方,请问至少需要多少次移动,设移动次数为 H(n) 。 首先我们肯定是把上面 n-1 个盘子移动到柱子 C 上,然后把最 大的一块放在 B 上,最后把 C 上的所有盘子移动到 B 上,由此我们 得出表达式: H⑴ = 1 H(n) = 2*H(n-1)+1 (n>1) 那么我们很快就能得到 H(n)的一般式: H(n) = 2^n - 1 (n>0) 并且这种方法的确是最少次数的,证明非常简单,可以尝试从 2 个盘子的移动开始证,你可以试试。

c语言递归算法及经典递归例子代码实现

c语言递归算法及经典递归例子代码实现

c语⾔递归算法及经典递归例⼦代码实现⼀、什么叫做递归?⼀个过程或 函数 在其定义或说明中有直接或间接调⽤⾃⾝的⼀种⽅法;递归函数就是直接或间接调⽤⾃⾝的函数,也就是⾃⾝调⽤⾃⼰;刚接触递归的同学,可能难以理解递归,难以理解的点可能很多,例如:1.函数为什么可以在⾃⼰的内部⼜调⽤⾃⼰呢?2.既然可以⾃⼰调⽤⾃⼰,那么递归运⾏过程中⼀定回有很多层相互嵌套,到底什么时候不再嵌套呢?3.递归运⾏过程中,相互嵌套的多层之间会有参数传递,多层之间是否会相互影响?递归两个要素1.递归边界2.递归的逻辑——递归"公式"递归的过程⼀定有参数的变化,并且参数的变化,和递归边界有关系.在难度较⼤的题⽬中,这两者均不容易直接得到.递归的种种问题,也许理解的同学可能可以⽤⼀句话解释清楚,但是不理解的同学再怎么说也没办法理解.下⾯通过⼏个简单的例⼦【体会】⼀下递归,先从【感性】的⾓度理解递归.1.Fibonacci数我们直到Fibonacci数的递推公式为:F(0)=F(1)=1,F(n)=F(n-1)+F(n-2) n>=2;这个明显地给出了递归边界n=0或1的时候F(n)的值,和递归逻辑F(n)=F(n-1)+F(n-2),即递推公式.所以这个递归函数不难书写#includeusing namespace std;int F(int n)//函数返回⼀个数对应的Fibonacci数{ if(n0 || n1)//递归边界return 1; return F(n-1) + F(n-2);//递归公式}int main(){ //测试int n; while(cin >> n) cout << F(n) << endl;return 0;}2.阶乘阶乘的递归公式为:代码如下:#includeusing namespace std;int F(int n){ if(n==0)//递归边界return 1;return n*F(n-1);//递归公式}int main(){ int n; cin >> n; cout << F(n) << endl;return 0;}3.数组求和给⼀个数组a[]:a[0],a[1],…,a[n-1]如何⽤递归的⽅式求和?仍然是两个问题:递归边界和递归公式.递归边界是什么?⼀时不容易想到,但是我们想到了求和,多个数的求和过程是什么,x,y,z,w⼿动求和的过程是什么?步骤如下:x+y=a,任务变为a,z,w求和a+z=b,任务变为b,w求和b+w=c得出答案思考⼀下,【得出答案】这⼀步为什么就可以得出答案呢?(废话?)是因为,⼀个数不⽤相加就能得出答案.所以,递归的边界就是只有⼀个数.所以,递归边界有了,那么递归公式呢?其实⼿动计算过程中,隐含了递归公式:其中+为求两个数的和,F为求多个数的和的递归函数.代码如下:#includeusing namespace std;int F(int a[],int start,int end){ if(start==end)//递归边界return a[start];return a[start] + F(a,start+1,end);//递归公式}int main(){ int a[] = {1,2,3,4,5}; int s=0,e=4; cout << F(a,s,e) << endl;return 0;}4.求数组元素最⼤值⼿动求最⼤值的过程是什么,遍历+⽐较,过程如下:例如,求3,2,6,7,2,4的最⼤值:先设置最⼤值max=-999999,然后将max和数组元素逐个(遍历)⽐较如果a[i]>max,则更新max的值为a[i],否则max不变,继续向后遍历,直到遍历结束.max<3,则max=3max>2,max=3不变max<6,则max=6max<7,则max=7max>2,max=7不变max>4,max=7不变遍历结束,max=7为最⼤值.和求和类似,递归的公式如下:其中max为求两个数的较⼤值函数,F为求多个数的最⼤值的递归函数.代码如下:#includeusing namespace std;#define max(a,b) (a>b?a:b)int F(int a[],int s,int e){ if(s==e) return a[s]; else if(s+1 == e)//递归边界return max(a[s],a[e]);return max(a[s],F(a,s+1,e));//递归公式}int main(){ int a[] = {5,1,4,6,2}; int s = 0,e = 4; cout << F(a,s,e) << endl;return 0;}之所以,说上⾯的⼏个例⼦是【简单例⼦】,是因为上述所有的递归都属于【单向递归】.单向递归,递归的路径就是⼀个⽅向,所以思路相对⽐较容易想到.较难的递归问题,⼀般都不是单向递归,⽽是需要使⽤【回溯】的⽅法,递归的⽅法不太容易想到.写在最后每天晚上20:00我都会开直播给⼤家免费分享C/C++学习知识和路线⽅法,C/C++交流学习群:814974917,邀请码:洋洋。

C语言技术中的递归算法实现方法

C语言技术中的递归算法实现方法

C语言技术中的递归算法实现方法递归是一种重要的算法思想,在C语言中可以通过递归来解决许多问题。

递归算法的核心思想是将一个大问题分解为若干个相同或相似的小问题,通过解决小问题来解决大问题。

本文将介绍C语言中递归算法的实现方法。

一、递归算法的基本原理递归算法的基本原理是函数调用自身。

在递归算法中,函数会不断地调用自身,直到满足某个条件才停止调用。

通过递归,可以将一个复杂的问题转化为一个或多个相同或相似的子问题,从而简化问题的解决过程。

二、递归算法的实现步骤1.确定递归函数的参数和返回值:在实现递归算法时,首先需要确定递归函数的参数和返回值。

参数是指传递给递归函数的数据,返回值是指递归函数的计算结果。

2.确定递归的终止条件:递归算法必须有一个终止条件,当满足该条件时,递归调用停止。

否则,递归将无限循环,导致程序崩溃。

3.确定递归的递推公式:递归算法通过递归的方式解决问题,需要确定递归的递推公式。

递推公式是指将一个大问题分解为一个或多个相同或相似的小问题的公式。

4.编写递归函数的代码:根据确定的参数、返回值、终止条件和递推公式,编写递归函数的代码。

递归函数的代码应该包括递推公式的实现和终止条件的判断。

三、递归算法的实例下面通过一个实例来介绍递归算法的具体实现方法。

假设我们要计算一个正整数n的阶乘,可以使用递归算法来解决。

```c#include <stdio.h>int factorial(int n) {// 终止条件if (n == 0 || n == 1) {return 1;}// 递推公式return n * factorial(n - 1);}int main() {int n;printf("请输入一个正整数:");scanf("%d", &n);printf("%d的阶乘为%d\n", n, factorial(n));return 0;}```在上述代码中,我们定义了一个名为factorial的递归函数,该函数用于计算一个正整数n的阶乘。

Java程序设计中的递归算法实现案例

Java程序设计中的递归算法实现案例

Java程序设计中的递归算法实现案例递归是一种重要的算法思想,在Java编程中经常会用到。

递归算法通过将一个问题分解为更小的子问题来解决,直至达到基本情况并返回结果。

在本文中,我们将介绍几个Java程序设计中常见的递归算法实现案例。

1. 阶乘计算阶乘是指从1乘积到n的连续整数,可以用递归实现。

下面是计算阶乘的递归算法代码:```javapublic static int factorial(int n) {if (n == 0 || n == 1) {return 1;} else {return n * factorial(n - 1);}}```2. 斐波那契数列斐波那契数列是指从第3项开始,每一项都等于前两项之和。

下面是计算斐波那契数列的递归算法代码:```javapublic static int fibonacci(int n) {if (n == 1 || n == 2) {return 1;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}```3. 数组求和对于一个整数数组,可以使用递归算法计算数组所有元素的和。

下面是计算数组求和的递归算法代码:```javapublic static int arraySum(int[] arr, int index) {if (index == arr.length - 1) {return arr[index];} else {return arr[index] + arraySum(arr, index + 1);}}```4. 链表反转链表反转也可以使用递归算法实现。

下面是链表反转的递归算法代码:```javaclass ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}}public static ListNode reverseList(ListNode head) {if (head == null || head.next == null) {return head;}ListNode newHead = reverseList(head.next);head.next.next = head;head.next = null;return newHead;}```5. 二叉树遍历二叉树的前序遍历、中序遍历和后序遍历都可以使用递归算法实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

递归实例2
有5个人坐在一起,问第5个人多少岁,他说比第4个 人大2岁;问第4个人岁数,他说比第3个人大2岁;问 第3个人,又说比第2个大2岁;问第2个人,说比第1 个人大2岁;最后问第1个人,他说他10岁;请问 第5个人多大?
ቤተ መጻሕፍቲ ባይዱ
终止条件:第一个人10岁 递归关系:每一个人的年龄都比其前1个人的年龄大
jc(3)
=3*jc(2)
=3*2 调用 jc(2)
=6
返回
=2*jc(1) =2*1 调用
jc(1)
=2 返回 =1
Private Sub Command1_Click()
a = Val(Text1.Text) b = jc(a)
递归函数的调用
Label1.Caption = str(a)+“的阶乘为:”Str(b)
直接递归调用
和尚讲故事:故事包含故事,故事都是同一故事
程序设计中,函数A自己调用自己,称为直接递归调用。
间接递归调用
镜子A和镜子B相对放在一起,你会发现 什么现象呢?
对了,我们会发现镜子
A中有镜子B的映象,镜
子B中又镜子A的映象,
这样层层叠叠,无穷无
A
尽。
B
在程序设计中,像这种函
数A调用函数B,函数B再反
递归算法
1、递归现象
例子1:
从前有座山,山里有座庙,庙里有个和尚, 和尚在讲故事。
从前有座山,山里有座庙,庙里有个和尚,和尚 在讲故事。
从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事。
从前有座山…
例子2:
两面镜子中间的你,产生“像中像” 德罗斯特效应(Droste effect)
例子3:
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age (2)+2
age(2)=age(1)+2
Function age (n as Integer)as Integer If n=1 then
age(1)=10
age =___1_0____
Else age=__a_g_e_(n__-1_)_+_2_
例子1、2都是抽象出来的递归现象,但是严格来 说并不是递归,因为会一直重复下去,没有终止 条件,违背算法的“有穷性”。
例3和例4有终止条件 例3中思想端正 例4中最后完全看懂的词
2、递归算法
递归算法: 一个函数直接或间接地调用自身的编程技巧 1. 直接递归调用:函数直接调用本身 2. 间接递归调用:函数间接调用本身
过来调用函数A的算法,
称为间接递归调用。
递归算法是语言设计中的一种重要方法,只需少量 的程序就可描述出解题过程,但是递归执行的过程 比较复杂。
递归算法关键:
1.递归关系 2.递归终止条件
递归实例1
设计一个vb程序,
输入正整数n,求出n的阶乘
5!=5*4*3*2*1=5*4!
4!=4*3*2*1=4*3!
End Function
习题2:小猴吃桃问题
有一天小猴子摘若干个桃子,当即吃了一半还觉得不过瘾,又多 吃了一个。第二天接着吃剩下桃子中的一半,仍觉得不过瘾 又多吃了一个,以后小猴子都是吃尚存桃子一半多一个。到 第10天早上小猴子再去吃桃子的时候,看到只剩下一个桃子。 问小猴子第一天共摘下了多少个桃子?
End Sub
递归算法的基本思想是把规模较大的、较难解决的问题变 成规模较小的、容易解决的同一问题,规模较小的问题又 变成规模更小的问题,当问题小到一定程度时,可以直接 得出它的解,从而得到原来问题的解。 即采用“大事化小、小事化了”的基本思想。
当n=3时
y=jc(3)化小 jc=3*jc(2) 化小 jc=2*jc(1) 化了 jc=1
《礼记·大学》:
古之欲明明德于天下者,先治其国;欲治其 国者,先齐其家;欲齐其家者,先修其身; 欲修其身者,先正其心;欲正其心者,先诚 其意;欲诚其意者,先致其知,致知在格物。 物格而后知至,知至而后意诚,意诚而后心 正,心正而后身修,身修而后家齐,家齐而 后国治,国治而后天下平。
美德彰明于天下 治理好国家 整顿好家 自我修养
else
jjcc=(nn)*=jcn(n*j-c1()n-1)
‘2、对于任意n>1找出jc(n)和jc(n-1)之 间的关系n!=n*(n-1)!
End if
End function
Function jc(byval n as integer) as integer
If n =1 then jc=1 else jc=n*jc(n-1) End if End Function
递归算法描述: Function 你有多少桃子?(第几天) If 第10天 Then 桃子数=1 Else 桃子数= ( 明天的桃子数+1)*2 End if End Function
End if
End Function
习题1:斐波那契数列问题
斐波那契数列,又称黄金分割数列,指的是这样一个数列: 1、1、2、3、5、8、13、21、34、55……
这个数列从第3项开始,每一项都等于前两项之和。 设计一个VB程序 求:数列中的第n项是多少?
1、终止条件:最初两项值为1 2、递归关系:第n项的值是它之前两项之和 ( n大于3 )
求第N个斐波纳切数 if 前两项 then 斐波纳切数=1 else 斐波纳切数=前两个斐波纳切数之和 end if
Function Fib (n as Integer)as Integer If n<3 then Fib =__1 Else Fib =__F_ib__(_n_-_2)_+_F_i_b__(n_-_1_)_ End if
3!=3*2*1=3*2!
2!=2*1=2*1!
1!=1
1:对于任意一个整数n (n>1): n!=n*(n-1)!
2:终止条件 n=1 1!=1
Function jc(n as integer) as integer
If n =1 then
jcjc(1=)1=1
‘1、终止条件:n=1 时jc(1)=1
平天下 治国 齐家 修身
思想端正
例子4:
为了解释一个词,需要使用更多的词。
当你查一个词,发现这个词的解释中某个词仍然不 懂,于是你开始查第二个词,可惜,第二个词里仍 然有不懂的词,于是查第三个词,这样查下去,直 到有一个词的解释是你完全能看懂的,那么递归走 到了尽头,然后你开始后退,逐个明白之前查过的 每一个词,最终,你明白了最开始那个词的意 思。。。
相关文档
最新文档