递归函数实验

合集下载

函数递归实验报告

函数递归实验报告

一、实验目的1. 理解递归函数的概念和基本原理;2. 掌握递归函数的设计方法;3. 通过实验加深对递归函数在实际问题中的应用理解。

二、实验环境1. 操作系统:Windows 10;2. 编程语言:C语言;3. 开发环境:Visual Studio 2019。

三、实验内容1. 设计一个递归函数,计算斐波那契数列的第n项;2. 设计一个递归函数,判断一个整数是否为素数;3. 设计一个递归函数,计算n的阶乘;4. 分析递归函数的性能,并讨论递归算法的优缺点。

四、实验步骤1. 设计斐波那契数列的递归函数斐波那契数列的定义如下:F(1) = 1, F(2) = 1F(n) = F(n-1) + F(n-2) (n > 2)下面是斐波那契数列的递归函数实现:```cint fibonacci(int n) {if (n <= 0) {return 0;} else if (n == 1 || n == 2) {return 1;} else {return fibonacci(n - 1) + fibonacci(n - 2); }}```2. 设计素数的递归函数判断一个整数是否为素数的递归函数实现如下:```cint is_prime(int n) {if (n <= 1) {return 0;} else if (n == 2) {return 1;} else {return is_prime(n - 1) && n % (n - 1) != 0; }}```3. 设计阶乘的递归函数计算n的阶乘的递归函数实现如下:```cint factorial(int n) {if (n <= 1) {return 1;} else {return n factorial(n - 1);}}```4. 分析递归函数的性能递归函数的性能分析如下:(1)斐波那契数列的递归函数存在大量重复计算,时间复杂度为O(2^n),效率较低;(2)素数的递归函数也存在重复计算,时间复杂度为O(n),相对较高;(3)阶乘的递归函数同样存在重复计算,时间复杂度为O(n),相对较高。

实验11 函数递归

实验11 函数递归

实验11 函数递归一.实验目的1.掌握函数的嵌套调用方法。

2.掌握函数的递归调用方法。

二.实验要求1.实验前复习函数的定义以及函数的嵌套、递归调用方式。

2.能够用程序流程图描述实验题目的算法。

3.能够独立调试运行实验题目。

4.本实验要求2学时完成。

三.实验内容和步骤题目1:编写两个函数,分别求两个正整数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果,两个正整数由键盘输入。

有好多方法解决最大公约数问题,如:辗转相除法、递归等。

本题是用辗转相除法,很容易理解,关键是解题的思路:输入两个正整数m和n,求其最大公约数a和最小公倍数b,计算最大公约数a的方法如下:先算出m/n的余数r,若r等于0,则n为最大公约数;若r 不为0,则把原来的n值作为新的m值,把原来的r值作为新的n值,继续运算。

这样辗转相除,直到r为0,此时的n值为最大公约数a,最小公倍数则可用原始m与n值的积除以最大公约数求得。

要求:程序填空并测试运行结果。

01#include <stdio.h>02#include <conio.h>0304int largedivisor(int m,int n)05{06int r;07if(m<n)08{09m=m+n;10n=m-n;11m=m-n;12}13while(n!=0)14{15r= 【1】;17n=r;18}19return m;20}2122int smallmultiple(int m,int n)23{24return m*n/ largedivisor(m,n);25}2627main( )28{29int largedivisor(int m,int n);30int smallmultiple(int m,int n);31int m,n;32printf("\nInput 2 positive integer:\n");33scanf("%d%d", 【2】);3435printf("The largest divisor is : %d\n", 【3】); /*输出最大公约数*/36printf("The smallest common multiple is:%d\n",【4】);/*输出最小公倍数*/ 3738getch();39}题目2:编一递归函数求n!。

算法设计与分析:递归与分治法-实验报告(总8页)

算法设计与分析:递归与分治法-实验报告(总8页)

算法设计与分析:递归与分治法-实验报告(总8页)实验目的:掌握递归与分治法的基本思想和应用,学会设计和实现递归算法和分治算法,能够分析和评价算法的时间复杂度和空间复杂度。

实验内容:1.递归算法的设计与实现3.算法的时间复杂度和空间复杂度分析实验步骤:1)递归定义:一个函数或过程,在其定义或实现中,直接或间接地调用自身的方法,被成为递归。

递归算法是一种控制结构,它包含了解决问题的基础情境,也包含了递归处理的情境。

2)递归特点:递归算法具有以下特点:①依赖于递归问题的部分解被划分为若干较小的部分。

②问题的规模可以通过递推式递减,最终递归终止。

③当问题的规模足够小时,可以直接求解。

3)递归实现步骤:①确定函数的定义②确定递归终止条件③确定递归调用的过程4)经典实例:斐波那契数列递推式:f(n) = f(n-1) + f(n-2)int fib(int n) {if (n <= 0)return 0;else}5)优化递归算法:避免重复计算例如,上述斐波那契数列的递归算法会重复计算一些中间结果,影响效率。

可以使用动态规划技术,将算法改为非递归形式。

int f1 = 0, f2 = 1;for (int i = 2; i <= n; i++) {f1 = f2;使用循环避免递归,重复计算可以大大减少,提高效率。

1)分治算法的定义:将原问题分解成若干个规模较小且类似的子问题,递归求解子问题,然后合并各子问题得到原问题的解。

2)分治算法流程:②将问题分解成若干个规模较小的子问题。

③递归地解决各子问题。

④将各子问题的解合并成原问题的解。

3)分治算法实例:归并排序归并排序是一种基于分治思想的经典排序算法。

排序流程:②分别对各子数组递归进行归并排序。

③将已经排序好的各子数组合并成最终的排序结果。

实现源代码:void mergeSort(int* arr, int left, int right) {if (left >= right)while (i <= mid && j <= right)temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];temp[k++] = arr[i++];1) 时间复杂度的概念:指完成算法所需的计算次数或操作次数。

递归实验报告

递归实验报告

递归实验报告递归实验报告引言递归是计算机科学中一种重要的概念,它在问题解决和算法设计中起到了关键的作用。

本文将对递归进行实验探究,通过编写一些递归函数来解决不同类型的问题,并对其性能和应用进行评估。

一、递归的基本原理递归是一种通过调用自身来解决问题的方法。

它包含两个重要的要素:基本情况和递归情况。

基本情况是指问题可以直接解决的情况,而递归情况则是指问题需要通过调用自身来解决的情况。

在递归函数中,我们需要确保递归情况能够最终达到基本情况,否则会出现无限递归的情况。

二、递归的应用1. 阶乘计算阶乘是一个常见的递归应用。

我们可以定义一个递归函数来计算一个正整数的阶乘。

例如,计算5的阶乘可以通过调用函数fact(5)来实现。

在函数内部,我们将问题转化为计算4的阶乘,并不断递归下去,直到问题达到基本情况,即计算1的阶乘为止。

2. 斐波那契数列斐波那契数列也是递归的一个经典应用。

该数列的定义是:第一个和第二个数为1,从第三个数开始,每个数都是前两个数之和。

我们可以编写一个递归函数来计算斐波那契数列中的第n个数。

在函数内部,我们将问题转化为计算第n-1个数和第n-2个数的和,并不断递归下去,直到问题达到基本情况,即计算第一个或第二个数为止。

三、递归的性能评估递归在解决某些问题时可以提供简洁的解决方案,但也可能带来性能上的问题。

递归函数的调用涉及到函数的压栈和弹栈操作,这会增加程序的开销。

在处理大规模问题时,递归可能导致栈溢出的问题。

因此,在使用递归时,我们需要仔细评估其性能,确保其适用于当前的问题规模。

四、递归的优化技巧为了提高递归函数的性能,我们可以采用一些优化技巧。

其中一种常见的优化方法是尾递归优化。

尾递归是指递归函数在递归调用时,只返回递归函数本身的结果,而不进行其他的计算。

这样可以减少函数调用的开销,提高程序的执行效率。

五、结论递归是一种强大的问题解决方法,它在计算机科学中有着广泛的应用。

通过实验我们可以发现,递归函数可以提供简洁的解决方案,但在处理大规模问题时需要注意其性能问题。

递归实验报告心得

递归实验报告心得

递归实验报告心得递归实验报告心得在进行递归实验的过程中,我深刻体会到了递归算法的独特魅力和应用价值。

递归算法是一种通过调用自身来解决问题的方法,它能够将复杂的问题简化为基本情况的解决方案。

通过实验,我进一步理解了递归算法的原理,并学会了如何正确地设计和实现递归函数。

首先,我学习了递归算法的基本思想。

递归算法的核心思想是将大问题分解为相同的小问题,并通过调用自身来解决这些小问题。

在编写递归函数时,我们需要明确两个重要的要素:递归终止条件和递归调用。

递归终止条件是指在什么情况下停止递归,而递归调用则是指在解决小问题后如何调用自身来解决大问题。

正确地确定这两个要素非常关键,它们直接影响到递归函数的正确性和效率。

其次,我学习了递归算法的应用场景。

递归算法在解决一些具有重复性质的问题时非常有效。

例如,在计算斐波那契数列、阶乘等数学问题时,递归算法可以提供简洁、直观的解决方案。

此外,递归算法还可以用于树和图的遍历、排列组合等问题的求解。

通过实验,我发现递归算法在这些场景下能够提供清晰、简洁的代码实现,并且具有较高的可读性和可维护性。

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

首先,递归算法的效率较低。

由于递归函数的调用过程需要频繁地压栈和出栈,所以递归算法的时间和空间复杂度较高。

在处理大规模问题时,递归算法可能会导致栈溢出等问题。

其次,递归算法的正确性需要保证递归终止条件的准确性和递归调用的合理性。

如果递归终止条件不准确或递归调用不合理,就可能导致无限递归或错误的结果。

为了克服递归算法的缺点,我们可以采取一些优化措施。

首先,可以尽量减少递归调用的次数,避免不必要的重复计算。

可以通过使用缓存、剪枝等技巧来提高递归算法的效率。

其次,可以考虑使用迭代算法来替代递归算法。

迭代算法通常具有更高的效率和更低的空间复杂度,但可能会牺牲一部分代码的可读性和可维护性。

通过这次递归实验,我不仅学会了递归算法的基本原理和应用技巧,还深刻体会到了递归算法在解决问题中的重要作用。

c语言函数的嵌套和递归调用方法的实验小结

c语言函数的嵌套和递归调用方法的实验小结

C语言函数的嵌套和递归调用方法的实验小结一、引言在C语言程序设计中,函数的嵌套和递归调用是两种常用的方法,它们在解决问题和实现特定功能时具有重要作用。

本文将结合实验结果,对C语言函数的嵌套和递归调用方法进行总结和分析,旨在加深对这两种方法的理解和应用。

二、函数的嵌套1. 概念与特点函数的嵌套是指在一个函数内部调用另一个函数。

当函数A中调用了函数B,函数B又调用了函数C,函数C又调用了函数D时,就形成了函数的嵌套调用。

函数的嵌套具有以下特点:(1)提高了程序的模块化和可读性,减少了代码的复杂度。

(2)可以在不同的函数之间传递参数,实现更灵活的功能组合。

(3)需要注意函数的声明顺序和作用域,避免出现未声明的函数引用错误。

2. 实验验证为了验证函数的嵌套调用,在实验中我们设计了一个简单的例子:编写两个函数,分别实现计算阶乘和计算组合数的功能,然后在主函数中进行嵌套调用,计算组合数的值。

实验结果表明,函数的嵌套调用可以实现相互依赖的功能模块,在程序设计中具有一定的灵活性和适用性。

三、递归调用1. 概念与特点递归调用是指一个函数在执行过程中调用了自身,从而形成了一种函数调用的循环结构。

通过递归调用,可以使函数不断重复执行,直到满足特定的条件才停止。

递归调用具有以下特点:(1)简化了程序的结构,使代码更加清晰和易于理解。

(2)能够处理一些需要多级嵌套的问题,极大地提高了代码的复用性和灵活性。

(3)需要设置递归调用的终止条件,避免形成无限循环,导致程序崩溃。

2. 实验验证为了验证递归调用的功能和特点,我们设计了一个典型的递归程序:计算斐波那契数列的前n项值。

实验结果表明,递归调用在实现该问题时具有简洁、高效的特点,使得代码易于阅读和理解,优雅地解决了该问题。

四、两种方法的比较1. 灵活性与适用性函数的嵌套调用主要适用于需要实现不同功能模块之间的交互和依赖关系的情况,具有较强的灵活性和可扩展性。

递归调用主要适用于解决问题具有明显的递归结构或需要多级嵌套的情况,具有较好的适用性和简洁性。

递归算法的实验报告

递归算法的实验报告

递归算法的实验报告引言递归算法是计算机科学中一种重要的算法思想,通过将问题分解为更小的子问题并逐步解决,从而实现问题的求解。

本实验旨在探讨递归算法的原理,并通过具体例子来说明递归算法的应用。

算法原理1.递归定义:递归算法通过将问题分解为规模更小的子问题来解决。

通常,递归算法会有一个或多个基准情况,当问题的规模达到基准情况时,递归调用将停止。

2.递归调用:在递归算法中,函数会调用自身来解决规模更小的子问题。

通过递归调用,问题的规模逐步缩小,直到达到基准情况。

3.递归终止条件:递归算法必须定义一个或多个递归终止条件,当满足这些条件时,递归调用将停止。

实验步骤为了更好地理解递归算法的应用,我们选取了斐波那契数列作为示例,并通过递归算法计算斐波那契数列的第n项。

1.确定递归终止条件:斐波那契数列的第0项和第1项为预定义的基准情况,所以递归终止条件为n=0或n=1。

2.实现递归算法:创建一个递归函数fibonacci(n),用于计算斐波那契数列的第n项。

3.处理递归调用:在递归函数中,当n大于1时,调用fibonacci(n-1)和fibonacci(n-2)来计算第n-1项和第n-2项,并将它们相加得到第n项的值。

4.返回计算结果:将计算得到的结果返回给调用者。

实验结果通过上述步骤,我们成功实现了递归算法来计算斐波那契数列的第n项。

以下是一些示例结果:•当n=0时,第0项为0。

•当n=1时,第1项为1。

•当n=2时,第2项为1。

•当n=3时,第3项为2。

•当n=4时,第4项为3。

我们还可以通过增大n的值来计算更多项的斐波那契数列。

实验总结通过本次实验,我们深入了解了递归算法的原理和应用。

递归算法通过将问题分解为更小的子问题,从而解决复杂的计算任务。

然而,递归算法也存在一些缺点,如效率较低和可能出现栈溢出的风险。

因此,在实际应用中需要谨慎使用递归算法,并针对具体问题选择合适的算法思想。

希望通过本次实验,读者对递归算法有了更深入的理解,并能够灵活运用递归算法解决实际问题。

递归实验报告

递归实验报告

递归实验报告递归实验报告一、引言递归是计算机科学中一个重要的概念,它在问题解决和算法设计中起着重要的作用。

本次实验旨在通过编写递归函数,深入理解递归的原理和应用,并通过实际案例来验证递归的有效性和效率。

二、递归的基本原理递归是一种自我调用的方式,通过将一个大问题分解为更小的子问题来解决。

递归函数在执行时会不断调用自身,直到满足某个终止条件才停止递归。

递归的基本原理可以用以下伪代码表示:```def recursive_function(parameters):if base_case_condition(parameters):return base_case_resultelse:recursive_function(modify_parameters)```其中,base_case_condition是终止条件的判断函数,base_case_result是终止条件满足时的结果,modify_parameters是将问题规模减小的操作。

三、递归的应用案例1. 阶乘计算阶乘是一个典型的递归应用案例。

可以通过以下递归函数计算n的阶乘:```def factorial(n):if n == 0:return 1else:return n * factorial(n-1)```2. 斐波那契数列斐波那契数列也是递归的典型应用之一。

可以使用以下递归函数计算第n个斐波那契数:```def fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)```四、递归的优缺点递归具有一些优点和缺点。

首先,递归可以使问题的解决过程更加简洁和直观,尤其是对于一些问题的自然描述。

其次,递归可以将复杂的问题分解为简单的子问题,提高代码的可读性和可维护性。

然而,递归也存在一些缺点,比如递归调用会占用较多的内存空间,递归过深可能导致栈溢出等问题。

递归函数实验报告心得

递归函数实验报告心得

一、实验背景在本次实验中,我们学习了递归函数的概念、原理以及应用。

递归函数是一种在函数内部调用自身的方法,它能够解决许多复杂的问题,具有简洁、直观的特点。

通过本次实验,我对递归函数有了更深入的了解,以下是我对实验的心得体会。

二、实验内容1. 实验目的通过本次实验,掌握递归函数的定义、原理和应用,能够运用递归函数解决实际问题。

2. 实验原理递归函数是一种在函数内部调用自身的方法,其特点是函数自身作为子问题解决者。

递归函数由两部分组成:递归基准和递归步骤。

(1)递归基准:当问题规模足够小,可以直接求解时,递归基准给出了问题的直接解。

(2)递归步骤:将原问题转化为一个规模较小的子问题,然后递归调用自身来求解。

3. 实验内容本次实验主要涉及以下几个递归函数的编写和测试:(1)计算阶乘(2)打印整数各位数(3)计算斐波那契数列(4)逆序输出字符串(5)汉诺塔问题三、实验过程及心得1. 阶乘函数在编写阶乘函数时,我首先确定了递归基准,即当n=1时,阶乘为1。

然后根据递归步骤,将原问题转化为计算n-1的阶乘,并将结果乘以n。

通过不断递归调用自身,最终得到n的阶乘。

心得:在编写递归函数时,要注意递归基准和递归步骤的确定,确保函数能够正确收敛。

2. 打印整数各位数该函数通过不断取余和整除操作,将整数拆分为各个位数,并逆序打印。

心得:在编写递归函数时,要注意处理好输入参数和返回值,确保函数逻辑正确。

3. 计算斐波那契数列斐波那契数列是一个经典的递归问题,通过递归调用自身,可以得到数列的任意项。

心得:在编写递归函数时,要注意优化递归过程,避免重复计算。

4. 逆序输出字符串该函数通过递归调用自身,将字符串的第一个字符输出,然后对剩余的字符串进行递归处理。

心得:在编写递归函数时,要注意处理边界条件,确保函数能够正确执行。

5. 汉诺塔问题汉诺塔问题是一个经典的递归问题,通过递归调用自身,将n-1个盘子移动到目标位置,然后将剩余的盘子移动到目标位置。

函数递归实验报告

函数递归实验报告

函数递归实验报告函数递归实验报告引言:函数递归是计算机科学中一种重要的概念,它可以简化问题的解决过程,使得代码更加简洁和易读。

通过递归,一个函数可以调用自身,从而实现对问题的不断分解和求解。

本实验旨在通过实际的例子,深入探究函数递归的原理和应用。

一、递归的基本原理递归的基本原理是将一个大问题分解为若干个相同或类似的子问题,通过解决子问题来解决整个问题。

在函数递归中,递归函数会调用自身,每次调用时传入不同的参数,直到达到某个终止条件,然后逐层返回结果,最终得到问题的解。

二、递归的经典应用——阶乘函数阶乘函数是函数递归的经典应用之一。

它的定义如下:```def factorial(n):if n == 0 or n == 1:return 1else:return n * factorial(n-1)```在上述代码中,当n等于0或1时,阶乘的结果为1;否则,阶乘的结果为n乘以(n-1)的阶乘。

通过递归调用,可以简洁地实现阶乘的计算。

三、递归的实际应用——斐波那契数列斐波那契数列是另一个经典的递归应用。

它的定义如下:```def fibonacci(n):if n == 0:return 0elif n == 1:return 1else:return fibonacci(n-1) + fibonacci(n-2)```在上述代码中,当n等于0时,斐波那契数列的结果为0;当n等于1时,结果为1;否则,结果为前两个数的和。

通过递归调用,可以方便地计算出斐波那契数列的第n项。

四、递归的优缺点函数递归的优点在于可以简化问题的解决过程,使得代码更加清晰和易于理解。

递归的思想符合人类的思维方式,能够将复杂的问题分解为简单的子问题,从而降低解决问题的难度。

然而,递归也存在一些缺点,比如递归调用可能会消耗较多的内存和时间,当递归的层数过多时,可能会导致栈溢出的问题。

五、递归的应用场景函数递归在实际开发中有着广泛的应用场景。

实验一:递归函数的设计与实现

实验一:递归函数的设计与实现

实验一:递归函数的设计与实现实验目的:掌握递归函数的设计与实现方法实验原理:递归函数的设计实验步骤:编写程序实现教材P12例2-5 整数划分问题问题描述:整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。

思路:递归函数的声明为 int split(int n, int m);其中n为要划分的正整数,m是划分中的最大加数(当m > n时,最大加数为n),1 当n = 1或m = 1时,split的值为1,可根据上例看出,只有一个划分1 或 1 + 1 + 1 + 1 + 1 + 1可用程序表示为if(n == 1 || m == 1) return 1;2 下面看一看m 和 n的关系。

它们有三种关系(1) m > n在整数划分中实际上最大加数不能大于n,因此在这种情况可以等价为split(n, n);可用程序表示为if(m > n) return split(n, n);(2) m = n这种情况可用递归表示为split(n, m - 1) + 1,从以上例子中可以看出,就是最大加数为6和小于6的划分之和用程序表示为if(m == n) return (split(n, m - 1) + 1);(3) m < n这是最一般的情况,在划分的大多数时都是这种情况。

从上例可以看出,设m = 4,那split(6, 4)的值是最大加数小于4划分数和整数2的划分数的和。

因此,split(n, m)可表示为split(n, m - 1) + split(n - m, m)实验要求:(1)使用C++或TC2.0(2)上机前要有源代码或流程图。

简易代码#include <stdio.h>#include<iostream.h>int q(int n,int m){if((n<1)||(m<1)) return 0;if((n==1)||(m==1)) return 1;if(n<m) return q(n,n);if(n==m) return q(n,m-1)+1;return q(n,m-1)+q(n-m,m);}int main(){int n,m;cout<<"请输入整数和最大加数:"<<endl;cin>>n>>m;cout<<"正整数"<<n<<"共有"<<q(n,m)<<"种不同的划分。

递归算法实验

递归算法实验

实验课程:算法分析与设计实验名称:实验一C/C++环境及递归算法(综合性/设计性)实验目标:1、熟悉C/C++语言的集成开发环境;2、通过本实验加深对递归过程的理解。

实验任务:掌握递归算法的概念和基本思想,分析并掌握排列问题的递归算法和Hanoi塔问题的递归算法。

实验题:1、设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。

任意输入一串整数或字符,输出结果能够用递归方法实现整数或字符的全排列。

2、设a,b,c是3个塔座。

开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。

各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。

实验设备及环境:PC;C/C++的编程环境Visual C++。

实验主要步骤:(1)明确实验目标和具体任务;(2)理解实验所涉及的分治算法;(3)编写程序并实现分治算法;(4)设计实验数据并运行程序、记录运行的结果;实验数据及运行结果、实验结果分析及结论:1、#include <iostream.h>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){for(int i=0;i<=m;i++)cout<<list[i];cout<<endl;}elsefor(int i=k;i<=m;i++){swap(list[k],list[i]);perm(list,k+1,m);swap(list[k],list[i]);}}void main(){int list[5]={1,2,3,4,5};perm(list,1,3);}实验结果:结果分析:数据为1,2,3,4,5,是以1开头,后面四位做全排列,所要排序的是2、3、4、5,那么共有4*3*2*1=24种结果,因而可知程序执行是正确的。

递归实验报告分析总结

递归实验报告分析总结

一、实验背景递归是一种编程技巧,通过函数自身调用自身的方式实现算法的求解。

递归算法在解决一些具有递归特性的问题上具有独特的优势,如斐波那契数列、汉诺塔等。

本实验旨在通过递归算法解决实际问题,加深对递归的理解和应用。

二、实验目的1. 掌握递归算法的基本思想和方法;2. 熟悉递归算法的编写和调试;3. 分析递归算法的时间复杂度和空间复杂度;4. 学会运用递归算法解决实际问题。

三、实验内容1. 斐波那契数列求解2. 汉诺塔问题3. 递归求解组合问题四、实验过程1. 斐波那契数列求解(1)问题描述:给定一个正整数n,求斐波那契数列的第n项。

(2)递归算法实现:```pythondef fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)```(3)分析:斐波那契数列递归算法的时间复杂度为O(2^n),空间复杂度为O(n)。

2. 汉诺塔问题(1)问题描述:有n个大小不同的盘子,初始放置在A柱子上,按照从小到大的顺序排列。

现要求将所有盘子移动到C柱子上,在移动过程中,每次只能移动一个盘子,且在移动过程中,大盘子不能放在小盘子上面。

(2)递归算法实现:```pythondef hanoi(n, source, target, auxiliary):if n == 1:print("Move disk 1 from", source, "to", target)returnhanoi(n-1, source, auxiliary, target)print("Move disk", n, "from", source, "to", target)hanoi(n-1, auxiliary, target, source)```(3)分析:汉诺塔递归算法的时间复杂度为O(2^n),空间复杂度为O(n)。

实验10 程序结构与递归函数

实验10 程序结构与递归函数

实验10 程序结构与递归函数【实验目的】(1)了解结构化程序设计的基本思想。

(2)掌握使用工程组织多个程序文件的方法。

(3)掌握函数嵌套的使用方法。

(4)掌握递归函数的编程方法。

【实验内容】一、调试示例改正下列程序中的错误。

设计一个常用圆形体体积的计算器,采用命令方式输入1、2、3,分别选择计算球体、圆柱体、圆锥体的体积,并输入计算所需的相应参数。

该计算器可支持多次反复计算,只要输入1、2、3,即选择计算3种体积,如果输入其他数字,将结束计算。

本例一共包含5个函数,它们的调用结构如图10.1所示,采用3个文件模块方式实现:error10_1_main.cpp、error10_1_cal.cpp、error10_1_vol.cpp,其中error10_1_vol.cpp包含3个函数vol_ball()、vol_cylind()、vol_cone()。

源程序(有错误的程序)文件error10_1_main.cpp1/* 常用圆形体的体积计算器:1.计算球体,2.计算圆柱体, 3.计算圆锥体*/2#include <stdio.h>3#include <math.h>4#include “error10_1_cal.c”;5#include “error10_1_vol.c”;6#define PI 3.1415926547int main(void)8{9int sel;1011/*循环选择计算圆形体的体积,直到输入非1-3的数字为止*/12while(1){ /*永久循环,通过循环体中的break语句结束循环*/13printf(“1-计算球体体积”);14printf(“2-计算圆柱体体积”);15printf(“3-计算圆锥体体积”);16printf(“其他-退出程序运行\n”);17printf(“请输入计算命令:”); /*输入提示*/18scanf(“%d”,&sel);19if(sel<1||sel>3) /*输入非1-3的数字,结束循环*/ 20break;21else22cal(sel);23}2425return 0;26}文件error10_1_cal.cpp1/*常用圆形体体积计算器的主控函数*/2void cal (int sel)3{4double vol_ball(void); /*函数声明*/5double vol_cylind(void);6double vol_cone(void);78swtich(sel){9case 1: /*计算球体体积*/10printf(“球体体积为:%.2f\n”, vol_ball());11break;12case 2:13printf(“圆柱体体积为:%.2f\n”,vol_cylind()); 14break;15case 3:16printf(“圆锥体体积为:%.2f\n”,vol_cone()) 17break;18}19}文件error10_1_vol.cpp1/*计算球体体积*/2double vol_ball()3{4double r;56printf(“请输入球体的半径:”);7scanf(“%lf”,&r);89return (4.0/3.0*PI*r*r*r);10}1112/*计算圆柱体体积*/13double vol_cylind()14{15double r,h;1617printf(“请输入圆柱体的半径和高:”);18scanf(“%lf%lf”,&r,&h);1920return (PI*r*r*h);21}2223/*计算圆锥体体积*/24double vol_cone()25{26double r;2728printf(“请输入圆锥体的半径:”);29scanf(“%lf”,&r);3031return (PI*r*r*h、3.0);32}运行结果(改正后程序的运行结果)1-计算球体体积2-计算圆柱体体积3-计算圆锥体体积其他-推出程序运行请输入计算命令:1请输入球体的半径:2球体体积为33.511-计算球体体积2-计算圆柱体体积3-计算圆锥体体积其他-推出程序运行请输入计算命令:3请输入球体的半径:2.4 3球体体积为18.101-计算球体体积2-计算圆柱体体积3-计算圆锥体体积其他-推出程序运行请输入计算命令:0实现方式1:文件包含方式(1)把3个源程序复制到同一个文件目录中。

递归实验报告

递归实验报告

陕西科技大学实验报告班级电信091 学号200906020127 姓名张成实验组别实验日期2012/3/29 室温15 报告日期2012/3/28 成绩报告内容:(目的和要求,原理,步骤,数据,计算,小结等)实验名称:《递归程序设计》一、实验目的:1、掌握递归程序设计的原理;2、熟悉递归程序的设计与应用。

二、实验内容:◆理解递归程序设计基本方法◆理解递归的三大要素◆根据整数乘法运算的特点,给出整数乘法运算的递归实现编写一个递归实现整数之间乘法运算的函数,并进行测试,验证设计的正确性三、实验方法:1)递归算法和课程前面讲的内容不同,递归算法不是一种数据结构,而是一种有效的算法设计方法。

递归算法是解决很多复杂问题的有效方法!2)在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。

若调用自身,称之为直接递归。

若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。

3)如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。

四、实验源码#include "stdio.h"#include "conio.h"long chengfa(int x,int y,int a){int z;a=x*y;if (y=1) printf("%d",a);if (y>1){a=x+chengfa(x,y-1,a);printf("%d",a);}return (a);}void main(){int x,y,z,a;printf("qing yi ci shu ru bei cheng he cheng wu:\n");scanf("%d %d",&x,&y);printf("cheng ji wei:\n");chengfa(x,y,a);}五、实验结果:应用算法insert,实现优先级的入队;应用算法pop,实现队的出队;六、实验心得a)递归算法应注意其执行逻辑;b)本实验编程算法设计思想无难度,但实现起来不是很简单,在队列的结构体中,成员有数据和数据的优先级,而且在每个元素入队时,均要与原来的每个元素进行优先级比较,并进行存放位置的相应修改。

实验一 循环与递归

实验一 循环与递归

实验一循环与递归一、实验目的进一步理解循环与递归程序设计的基本思想,充分利用基本的机械化操作设计高质量的算法。

二、实验要求1、上机前的准备工作根据实验内容中所给题目,利用所学循环与递归的基本设计思想设计算法并编写好上机程序,以提高上机效率;2、独立上机,输入、调试所编程序;3、上机结束后,写出实验报告。

4、上机时间:2学时三、实验内容1、核反应堆中有α和β两种粒子,每秒钟内一个α粒子可以反应产生3个β粒子,而一个β粒子可以反应产生1个α粒子和2个β粒子。

若在t=0时刻的反应堆中只有一个α粒子,求在t时刻的反应堆中α粒子和β粒子数。

#include <iostream>using namespace std;int X(int n);int Y(int n){if(n==1) return 3;return 3*X(n-1)+2*Y(n-1);}int X(int n){if(n==1) return 0;return Y(n-1);}void main(){int t;cout<<"请输入t的值:";cin>>t;cout<<"粒子的个数依次为:"<<X(t)<<","<<Y(t)<<endl;}运行结果:2、求这样的两位数据:五位数=3*四位数,9个数字各不相同#include <iostream>using namespace std;int main(){long x, y1, y2;int p[10],i,t,k;for (x=3334;x<=9999; x++){for(i=0; i<=9; i=i+1)p[i]=0;y1=3*x ;k=0;y2=10000*y1+x;while(y2>=0){t=y2 % 10;if(p[t]==1)break;y2=y2/10;p[t]++;k++;}if(k==9)cout<<"四位数:"<<x<<","<<"五位数:"<< y1<<endl;}}运行结果:3、A、B、C、D、E五人为某次竞赛的前五名,他们在比赛前猜名次:A说:B得第三名,C得第五名B说:D得第二名,E得第四名C说:B得第一名,E得第四名D说:C得第一名,B得第二名E说:D得第二名,A得第三名结果每个人都猜对了一半,实际名次是什么?#include <iostream>using namespace std;void main( ){int a,b,c,d,e;for( a=1;a<=5;a++)for( b=1;b<=5;b++)if (a!=b)for( c=1;c<=5;c++)if (c!=a&&c!=b)for( d=1;d<=5;d++)if (d!=a && d!=b && d!=c ){e=15-a-b-c-d;if (e!=a&&e!=b&& e!=c&&e!=d)if(((c==5)+(b==3))==1&&((d==2)+(e==4))==1&& ((b==1)+(e==4))==1&& ((c==1)+(b==2))==1&& ((d==2)+(a==3))==1)cout<< "a,b,c,d,e="<<a<<b<<c<<d<<e<<endl;}}运行结果:4、从下列题中任选其一:1)国王分财产。

递归实验报告

递归实验报告

递归实验报告篇一:字符串,递归实验报告宁波工程学院电信学院计算机教研室实验报告一、实验目的1)熟悉串的定义和串的基本操作。

2)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。

3)熟悉递归的定义和递归的算法设计。

4)加深对递归算法的理解,逐步培养解决实际问题的编程能力。

二、实验环境装有Visual C++6.0的计算机。

三、实验内容1、凯撒加密算法凯撒密码(caeser)是罗马扩张时期朱利斯?凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。

它将字母表中的字母移动一定位置而实现加密。

他的原理很简单,说到底就是字母与字母之间的替换。

每一个字母按字母表顺序向后移3位,如a加密后变成d,b加密后变成e,······x加密后变成a,y加密后变成b,z加密后变成c。

例如:“baidu”用凯撒密码法加密后字符串变为“edlgx”。

试写一个算法,将键盘输入的文本字符串(只包含a~z 的字符)进行加密后输出。

另写一个算法,将已加密后的字符串解密后输出。

提示:? 如果有字符变量c加密后则=’a’+(c-‘a’+3)%26? 采用顺序结构存储串,键盘输入字符串后保存到顺序串中;输出用顺序串的输出函数。

程序:#include#define MaxSize 100typedef struct //串的类型定义char ch[MaxSize];//存放串字符int len; //串长}SqString;void SetString(SqString &s) //设置源码{int i;printf("请输入原字符串:");scanf("%s",s.ch);for(i=0;s.ch[i]!='\0';i++); //计算串的长度s.len=i;}void TranString(SqString s,SqString &t)//开始加密{int i;for(i=0;i {if(s.ch[i]>='a'&&s.ch[i] t.ch[i]='a'+(s.ch[i]-'a'+3)%26; //将每一个字母按字母表顺序向后移3位elset.ch[i]=s.ch[i];//如果字符不是字母a~z,则原样保留}t.len=s.len;}void RecoverString(SqString s,SqString &t) //开始解密{int i;for(i=0;i {if(s.ch[i]>='d'&&s.ch[i] t.ch[i]=s.ch[i]-3;else if(s.ch[i]>='a'&&s.ch[i] t.ch[i]=s.ch[i]+23;elset.ch[i]=s.ch[i]; //如果字符不是字母a~z,则原样保留 }t.len=s.len;}void DispString(SqString s) //输出字符串int i=0;while(i {printf("%c",s.ch[i]); //字母的逐个输出i++;}printf("\n");}int main(){SqString s1,s2,s3; //s1是源码,s2是加密后密码,s3是解密后密码SetString(s1); //输入字符串DispString(s1); //输出字符串TranString(s1,s2);//加密DispString(s2); //加密后输出字符串RecoverString(s2,s3);//解密DispString(s3); //解密后输出字符串return 0;}按实验要求首先定义顺序串,实验的难点在于密码的加密和解密的实现,特别是再解密时,字母的溢出问题,在参考网上程序后很好地解决了这个问题。

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

递归函数实验
1、爬楼梯问题
若一步可以跨一个台阶,或者两个台阶,编写递归函数求解爬上第n个台阶的爬法。

再编写主函数,调用该递归函数求解爬上10阶台阶的爬法。

2、最大公约数
编写递归函数实现最大公约数的求解。

再编写主函数,输入两个正整数,然后调用该递归函数求它们的最大公约数。

3、数值转换
编写递归函数实现十进制整数到二至十六进制数之间的转换。

再编写主函数,输入一个十进制整数,随机产生一个2~16之间的整数r,然后调用该递归函数将十进制整数转换成r进制整数。

4、二分法查找
编写递归函数实现在递减排列的整型数组a(元素个数为n)中,用二分法查找数x.。

再编写主函数调用该递归函数。

5、最短路径问题
编写递归函数int fun(int x1,int y1,int x2,int y2),其功能是求两点(x1, y1)和(x2, y2)间最短路径的条数,在下图中,若必须经过点C,求A到B的最短路径有多少条。

6、。

相关文档
最新文档