递归练习(2)

合集下载

递归时间复杂度例题

递归时间复杂度例题

以下是递归时间复杂度的例子:
1.计算整数x的n次方
暴力算法的时间复杂度为O(n),空间复杂度为O(1)。

而使用递归算法,每次递归可以将问题规模减半,因此时间复杂度可以降低到O(logn),但空间复杂度会增加到O(logn)。

2.斐波那契数列
斐波那契数列是一个经典的递归问题,其定义如下:F(0) = 0,F(1) = 1,F(n) = F(n-1) + F(n-2)(n >= 2)。

如果直接使用递归算法来计算斐波那契数列的第n项,时间复杂度会达到O(2^n),因为会有很多重复的计算。

可以使用动态规划或记忆化搜索来优化算法,将时间复杂度降低到O(n)。

3.归并排序
归并排序是一种使用递归的排序算法,其基本思想是将待排序的数组分成两半,分别递归地对它们进行排序,然后将排好序的两个子数组合并成一个有序的数组。

归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。

4.汉诺塔问题
汉诺塔问题是一个经典的递归问题,其目标是将一堆大小不同的盘子从一个柱子移动到另一个柱子上,并满足以下条件:每次只能移动一个盘子;大盘子不能放在小盘子上面。

可以使用递归算法来解决汉诺塔问题,其基本思想是将问题分解成两个子问题:将上面的n-1个盘子从起始柱子移动到辅助柱子上,再将最大的盘子从起始柱子移动到目标柱子上,最后将n-1个盘子从辅助柱子移动到目标柱子上。

汉诺塔问题的时间复杂度为O(2^n),空间复杂度为O(n)。

这些例子表明,递归算法的时间复杂度和空间复杂度取决于问题的性质和递归的实现方式。

因此,在设计递归算法时,需要仔细分析问题,选择合适的递归策略,并进行适当的优化。

简单递归例子

简单递归例子

简单递归例子
1. 嘿,你知道计算阶乘吧,那就是个简单递归例子呀!比如说,计算 5 的阶乘,不就是 5 乘以 4 的阶乘嘛,4 的阶乘又是 4 乘以 3 的阶乘,一直
这样递推下去,直到 1 的阶乘就是 1,多神奇呀!
2. 哎呀呀,斐波那契数列也是呢!前两个数是 0 和 1,后面每个数都
是前两个数的和,这就是妥妥的递归呀!你想想,像不像搭积木,一层一层搭起来的感觉。

3. 还有走迷宫!当你在一个岔路口选择一条路走下去,如果碰到死胡同,就回到岔路口再选另一条路,这也有点递归的味道啊,是不是很有意思呢?
4. 你看画树的例子呀!先画一个主干,然后从主干上再长出分支,每个分支又可以长出更小的分支,这不就是用递归在构建嘛!
5. 计算最大公约数也能用递归呢!如果两个数不相等,就把大的数变成大的数减去小的数,小的数不变,然后再去算,这不就是在反复进行一个过程嘛,多酷!
6. 就说汉诺塔问题吧!把盘子从一个柱子移动到另一个柱子,不也得靠递归的思路嘛!这就像接力赛,一环扣一环的。

7. 像倒着数数也是呀!从 10 数到 1,不就是每次减去 1 然后接着数,这也是一种简单的递归呀!
8. 你瞧,生活中好多地方都有递归的影子呢!这真的很神奇,不是吗?简单的递归例子就在我们身边呀,让我们发现更多有趣的递归吧!
我的观点结论:递归在很多地方都有体现,而且非常有趣,大家可以多多留意去发现呀。

递归练习题

递归练习题

递归练习题1.设计一个函数:double power(double x,int n);返回x的n次方值。

2.设计一个函数: bool check(int n,int d);如果数字d在整数n的某位中出现,则返回真值,否则返回假值。

例如:check(35628,6)=true ,check(35928,7)=false。

3.设计一个函数:int digit(int n,int k);它返回整数n从右边开始数第k个数字的值。

例如:digit(35628,4)=5, digit(628,5)=0。

4.设计一个函数:int sumofn(int n);它返回整数n的各位数字之和。

例如:sumofn(35628)=24, sumofn(628)=16。

5.设计一个函数int reverse(int n);将整数n反向。

例:reverse(1276)=6721。

6.设计一个高效函数:bool prime(int n);当n为素数时,它返回真值,否则返回假值。

7.设计一个函数:bool ninm(int n,int m);如果构成整数n的数字都在整数m中出现,则返回真值,否则返回假值。

例如:ninm(35323,523)=true ,ninm(187,18)=false。

8.设计一个函数:bool rev(s:string);字符串s是回文时返回真值,否则返回假。

9.设计一个函数:bool revn(int n);整数n是回文时返回真值,否则返回假。

10.用选择排序技术设计一个过程:void sortp(int a[],int n);对数组a 的n个元素进行排序。

11.函数f(m,n)定义为:f(m,n)=f(m-1,f(m,n-1)) 当m*n<>0 时;f(m,n)=m+n+1 当m*n=0 时。

设计递归函数求解f(m,n).12.ackerman函数ack(m,n)定义为:ack(m,n)=ack(m-1,ack(m,n-1)) 当 m,n>=1 时;ack(m,0)=ack(m-1,1), 当m>=1 时;ack(0,n)=n+1, 当n>=0 时。

C语言递归练习(附答案)

C语言递归练习(附答案)
10. 求两个数的最小公倍数。 最小公倍数于2个数之积乘最好公约数
m*n/fgongyue(m,n)
11. 输入一个数,求这个数的各位数字之和。 add_every_num(int num) { if(num<10) return num; return num%10+add_every_num(num/10); }
dic 递归基础练习题: 1. 求 1+2+3+……+n 的值 //a+(a+1)+…+b int sum(int a,int b) {
if(b==a) return a; return a+sum(a+1,b); } 2. 求 1*2*3*……*n 的值 a*(a+1)*(a+2)…*b cheng(int begin,int end) { if(begin==end) return begin; return begin * cheng(begin+1,end); } 5. 小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一 半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第 10 天早上猴子想再吃时发现, 只剩下一个桃子了.问第一天猴子共摘多少个桃子? fruit(int begin,int times) {
13. 将十进制转换为二进制。
#include "stdafx.h" #include "stdio.h"
int fc(int num) {
if(num == 1) {
printf("%d",num); return 0; } fc(num/2); printf("%d",num%2); }

递归练习题(打印版)

递归练习题(打印版)

递归练习题(打印版)### 递归练习题(打印版)#### 一、递归基础概念题1. 定义题:请简述什么是递归,并给出递归的基本形式。

2. 判断题:以下哪些函数是递归的?- A. `f(x) = x + 1`- B. `g(n) = n * g(n-1)` (n > 0)- C. `h(x) = x * h(x-1)` (x > 1)3. 简答题:递归和迭代有什么区别?#### 二、递归函数编写题1. 编写递归函数:编写一个递归函数,实现阶乘计算。

2. 编写递归函数:编写一个递归函数,实现斐波那契数列的第n项。

3. 编写递归函数:编写一个递归函数,实现汉诺塔问题的解决方案。

#### 三、递归算法应用题1. 应用题:如何使用递归算法解决归并排序问题?2. 应用题:使用递归算法解决二叉树的深度优先搜索(DFS)。

3. 应用题:描述如何使用递归算法实现图的深度优先搜索(DFS)。

#### 四、递归优化题1. 优化题:对于递归算法,如何避免重复计算?2. 优化题:请解释尾递归优化的概念,并给出一个尾递归的例子。

3. 优化题:如何使用记忆化递归(Memoization)来优化递归算法?#### 五、递归问题解决题1. 问题解决题:给定一个数字n,请使用递归算法找出n的二进制表示中1的个数。

2. 问题解决题:使用递归算法实现一个函数,判断一个字符串是否是回文。

3. 问题解决题:给定一个整数数组,使用递归算法找出数组中的最大值。

#### 六、递归思维拓展题1. 思维拓展题:递归算法在解决哪些类型的问题时特别有效?2. 思维拓展题:在编程中,递归算法有哪些潜在的缺点?3. 思维拓展题:请讨论递归算法在人工智能领域的应用。

#### 七、递归实践题1. 实践题:实现一个递归函数,用于计算组合数C(n, k)。

2. 实践题:编写一个递归函数,实现快速排序算法。

3. 实践题:给定一个字符串,使用递归算法实现字符串的反转。

递归基础练习题

递归基础练习题

递归基础练习题1.求1+2+3+……+n的值2.求1*2*3*……*n的值3.数的全排列问题。

将n个数字1,2,…n的所有排列按字典顺序枚举出来2312133123214.数的组合问题。

从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。

如n=3,m=2时,输出:1213239.求两个数的最大公约数。

10.求两个数的最小公倍数。

5.小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子8.着名的菲波拉契(Fibonacci)数列,其第一项为1,第二项为1,从第三项开始,其每一项都是前两项的和。

编程求出该数列前N项数据。

15.梯有N阶,上楼可以一步上一阶,也可以一次上二阶。

编一个程序,计算共有多少种不同的走法。

6.有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。

问过n个月后共有多少对兔子7.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。

这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子经过每个村子卖出多少只鸭子11.输入一个数,求这个数的各位数字之和。

12.角谷定理。

输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。

经过如此有限次运算后,总可以得到自然数值1。

求经过多少次可得到自然数1。

如:输入22,输出168421STEP=1613.将十进制转换为二进制。

14.计算M=max(a,b,c)/[max(a+b,b,c)*max(a,b,b+c)],其中a,b,c由键盘输入。

16.某人写了n封信和n个信封,如果所有的信都装错了信封。

求所有的信都装错信封共有多少种不同情况17.给出一棵二叉树的中序与后序排列。

求出它的先序排列。

18.求把一个整数n无序划分成k份互不相同的正整数之和的方法总数。

函数的递归练习题

函数的递归练习题

函数的递归练习题在计算机科学中,函数的递归是一种常见的编程技巧,它通过在函数体内调用自身来解决问题。

递归可以帮助我们解决一些复杂的问题,比如数学中的阶乘、斐波那契数列等等。

本文将介绍一些常见的函数递归练习题,让我们一起来探索递归的奥秘吧!1. 计算阶乘阶乘是一个非常经典的递归问题。

给定一个非负整数 n,我们可以通过以下递归公式来计算它的阶乘:```n! = n * (n-1)!```当 n 等于 0 或 1 时,阶乘的值都为 1。

我们可以将以上递归公式转化为代码:```pythondef factorial(n):if n == 0 or n == 1:return 1else:return n * factorial(n-1)```通过调用 `factorial(n)` 函数,我们可以计算出 n 的阶乘。

2. 斐波那契数列斐波那契数列是另一个常见的递归问题。

在斐波那契数列中,每个数字是前两个数字之和。

数列的前几个数字是 0、1、1、2、3、5、8 等等。

我们可以使用以下递归公式来计算第 n 个斐波那契数:```F(n) = F(n-1) + F(n-2)```其中 F(0) 和 F(1) 的值分别为 0 和 1。

将以上递归公式转化为代码:```pythondef fibonacci(n):if n == 0:return 0elif n == 1:return 1else:return fibonacci(n-1) + fibonacci(n-2)```通过调用 `fibonacci(n)` 函数,我们可以计算出斐波那契数列的第 n 个数字。

3. 汉诺塔问题汉诺塔问题是一个经典的递归问题,最初是由法国数学家爱德华·卢卡斯在 19 世纪提出的。

问题的设定是这样的:我们有三个柱子和一些不同大小的圆盘,开始时所有圆盘按照大小从上到下依次放置在第一个柱子上。

我们的目标是将所有圆盘移动到第三个柱子上,同时满足以下规则:- 每次只能移动一个圆盘;- 大圆盘不能放在小圆盘之上。

递归的经典例子

递归的经典例子

递归的经典例子
1. 算数学题的时候啊,像计算一个数的阶乘,这就是一个递归的经典例子呀!比如说计算 5 的阶乘,不就是 5 乘以 4 的阶乘嘛,而 4 的阶乘又等于 4 乘以 3 的阶乘,依次类推,这多有意思啊!
2. 还有走迷宫呢,你想想,当你在迷宫里遇到岔口,你选择一条路走,然后又遇到岔口,又继续选择,这不就跟递归很像嘛!你不断地进入更小的问题去探索,直到找到出口,这难道不是很神奇吗?
3. 画树也可以用递归呀!先画一个树干,然后树干上又分出树枝,每个树枝又可以当作新的树干去继续分树枝,这不就跟递归的过程一样嘛,哇塞,这样就能画出一棵复杂又漂亮的树啦!
4. 你知道汉诺塔游戏不?那就是典型的递归例子哟!要把盘子从一个柱子移到另一个柱子,不就得不断地用递归的方法去解决嘛,天啊,真是好烧脑又好有趣!
5. 再来说说我们电脑里的文件系统,那也是递归的体现呀!文件夹里有子文件夹,子文件夹里还有子文件夹,就这么一层层下去,像不像递归在大展身手呢?
6. 回忆一下我们看电影的时候,很多故事里不是也有类似递归的情节嘛!主角解决一个问题又引出新的问题,然后一直这么循环,这也可以说是一种故事里的递归呀,多有意思的发现呀!
总之,递归在生活中无处不在,它就像一把神奇的钥匙,能打开很多复杂问题的大门,给我们带来惊喜和挑战!。

c语言递归试题及答案

c语言递归试题及答案

c语言递归试题及答案递归是一种在函数中调用自身的编程技巧。

在学习C语言时,递归是一个重要的概念,掌握递归的用法对于解决问题非常有帮助。

本文将介绍一些常见的C语言递归试题,并提供详细的答案解析。

一、计算阶乘题目:编写一个递归函数,计算给定正整数n的阶乘。

答案:```c#include <stdio.h>int factorial(int n) {if (n == 0) {return 1;} else {return n * factorial(n - 1);}}int main() {int n;printf("请输入一个正整数:");scanf("%d", &n);printf("%d的阶乘为:%d\n", n, factorial(n));return 0;}```解析:该程序定义了一个递归函数factorial,当n为0时,递归结束,返回1;否则,返回n与factorial(n-1)的乘积。

在主函数中,用户输入一个正整数n,调用factorial函数进行阶乘计算并输出结果。

二、斐波那契数列题目:编写一个递归函数,计算给定正整数n的斐波那契数列值。

答案:```c#include <stdio.h>int fibonacci(int n) {if (n == 0 || n == 1) {return n;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}int main() {int n;printf("请输入一个正整数:");scanf("%d", &n);printf("斐波那契数列第%d项的值为:%d\n", n, fibonacci(n));return 0;}```解析:该程序定义了一个递归函数fibonacci,当n为0或1时,递归结束,返回n;否则,返回fibonacci(n-1)与fibonacci(n-2)的和。

递归算法典型例题数楼梯

递归算法典型例题数楼梯

递归算法典型例题数楼梯递归算法是计算机科学领域常见且重要的概念之一。

它通过将问题分解为更小的子问题,并使用函数自身来解决这些子问题,从而实现对原始问题的解决。

在本文中,我们将探讨一个经典的递归算法问题:数楼梯。

在这个问题中,我们需要使用递归算法来计算爬n个楼梯的不同方式数量。

假设我们有n个楼梯,每次可以选择爬1个楼梯或2个楼梯。

我们的目标是找出爬到第n个楼梯的所有不同方式的数量。

为了解决这个问题,我们可以使用递归算法。

首先,我们考虑最简单的情况,当n等于0或1时,只有一种方式,即不爬楼梯。

当n等于2时,有两种方式,即爬1个楼梯两次或爬2个楼梯一次。

这些是我们的递归基。

然后,我们可以将问题拆分为更小的子问题。

假设我们已经知道了爬到第n-1个楼梯的方式数量(f(n-1))和爬到第n-2个楼梯的方式数量(f(n-2)),那么我们可以通过以下方式计算爬到第n个楼梯的方式数量:f(n) = f(n-1) + f(n-2)因为我们每次只能选择爬1个或2个楼梯,所以爬到第n个楼梯的方式数量等于爬到第n-1个楼梯方式数量加上爬到第n-2个楼梯方式数量的和。

现在,我们可以编写递归函数来解决这个问题。

以下是一个简单的递归函数来计算爬到第n个楼梯的方式数量:```pythondef count_stairs(n):if n == 0 or n == 1:return 1else:return count_stairs(n-1) + count_stairs(n-2)```在这个递归函数中,我们首先处理递归基的情况。

如果n等于0或1,我们返回1,表示只有一种方式。

否则,我们递归地调用函数count_stairs来计算爬到第n-1个楼梯和第n-2个楼梯的方式数量,并返回它们的和。

然而,上面的递归函数存在一个明显的问题。

当我们计算较大的n时,会出现重复计算的情况。

例如,在计算count_stairs(5)时,我们需要计算count_stairs(4)和count_stairs(3)。

python递归题目

python递归题目

python递归题目以下是一些常见的Python递归题目:1. 阶乘:编写一个函数来计算给定数字的阶乘。

```pythondef factorial(n):if n == 1:return 1else:return n * factorial(n-1)```2. 斐波那契数列:编写一个函数来计算给定位置的斐波那契数。

```pythondef fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)```3. 数组求和:编写一个函数来计算给定数组的所有元素之和。

```pythondef array_sum(arr, n):if n <= 0:return 0else:return array_sum(arr, n-1) + arr[n-1]```4. 列表反转:编写一个函数来反转给定列表的顺序。

```pythondef reverse_list(arr):if len(arr) == 0:return []else:return [arr[-1]] + reverse_list(arr[:-1])```5. 判断回文串:编写一个函数来判断给定字符串是否是回文串。

```pythondef is_palindrome(string):if len(string) <= 1:return Trueelif string[0] != string[-1]:return Falseelse:return is_palindrome(string[1:-1])```这些题目可以帮助你理解递归的概念和应用。

请注意,在实际的编程中,代码的效率可能需要进行优化,以避免递归的深度过深导致的堆栈溢出。

python递归题

python递归题

python递归题摘要:1.递归的概念2.Python 中的递归函数3.递归的利与弊4.递归的应用实例正文:1.递归的概念递归是一种函数调用自身的技术。

在编程中,递归是一种解决问题的方法,它将大问题分解成相似的子问题,然后通过解决子问题来解决大问题。

当子问题变得足够小时,它们可以被直接解决。

递归函数在解决一个问题时,会调用自身来解决更小的子问题,通常在函数中包含一个基本情况(base case),以确保递归会终止。

2.Python 中的递归函数在Python 中,可以使用递归来编写函数。

递归函数通常包含一个基本情况,以确保函数会终止。

例如,可以使用递归函数计算阶乘、斐波那契数列等。

下面是一个计算阶乘的递归函数示例:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n-1)```3.递归的利与弊递归是一种非常有用的编程技术,它可以帮助我们解决许多复杂的问题。

然而,递归也有其缺点。

首先,递归会导致函数调用栈的深度增加,这可能导致栈溢出,特别是在解决大型问题时。

其次,递归函数通常不如循环函数高效,因为递归函数需要进行函数调用和返回,而循环函数则不需要。

4.递归的应用实例尽管递归有其缺点,但它仍然是解决问题的一种非常有效的方法。

以下是一些递归函数的应用实例:- 计算阶乘- 计算斐波那契数列- 解决八皇后问题- 解决汉诺塔问题递归是一种强大的编程技术,可以帮助我们解决许多复杂的问题。

递归及练习——精选推荐

递归及练习——精选推荐

递归及练习递归:分析:递归的思想,举个例⼦吧!!!电影院看电影院,当你去晚了,然后从最后⼀排问,你是第⼏排,⼀直问到第⼀排,然后第⼀排的⼈⼜以相同的⽅式传回来,重复做相同的⼯作,先去传递“你是第⼏排”这个问题,然后回归给⾃⼰“我是第⼏排”,得到结果。

⾃⼰调⽤⾃⼰,会出现⽆限循环的问题(死循环),所以必须有跳出,结束条件,才能有结果。

先传递,后回归。

必须有跳出才有结果。

⾃⼰调⽤⾃⼰。

找规律eg:⽤递归算阶乘 5的阶乘 1 * 2 * 3 * 4 * 5分析:5! == 5 * 4!4! == 4 * 3!3! == 3 * 2!2! == 2 * 1!fn(5);return 5 * fn(4);fn(4)return 4 * fn(3)fn(3)return 3 * fn(2)fn(2)return 2 * fn(1)......//实现function fn(n){if(n == 1) return 1;return n * fn(n-1);}console.log(fn(5));11.递归案例1.利⽤递归求1-100的和//分析// 100 + fn(99);// 99 + fn(98);//实现function sum(n){if(n <= 1) return 1;return n + sum(n-1);}console.log(sum(5));2.兔⼦ 3个⽉成年 ——> 繁殖1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987//分析:fn(n) = fn(n-1) + fn(n-2);fn(10) = fn(9) + fn(8);fn(9) = fn(8) + fn(7);fn(8) = fn(7) + fn(6);....function fn(n){if(n == 1 || n == 2){return 1;}return fn(n-1) + fn(n-2);}console.log(fn(8));3.求最⼤公约数(辗转相除法(计算过程为:两个数相除得到余数,余数不为0时,让两个数中的最⼩数与余数在相除,直到余数为0时,那个最⼩数就为它们的最⼤公约数)) function fn(m,n){var r = m % n;m = n;n = r;if(r == 0){return m;}else{return fn(m,n);}}console.log(fn(16,8));4.编写⼀个函数,输⼊n为偶数时,调⽤函数求1/2+1/4+...+1/n,当输⼊n为奇数时,调⽤函数求/1+1/3+...+1/n 分析: 10 1 / 10 + 1 / 8 + 1 / 6 11 1 / 11 + 1/ 9 + 1 / 7.... 规律:1 / n + fn(n - 2); 实现: function fn(n){ if(n == 1 || n == 2){ return 1/n; } return 1 / n + fn(n-2); } console.log(fn(10));。

关于递归的一些小练习

关于递归的一些小练习

关于递归的⼀些⼩练习递归什么是递归在程序中, 所谓的递归, 就是函数⾃⼰直接或间接的调⽤⾃⼰.1. 直接调⽤⾃⼰2. 间接调⽤⾃⼰就递归⽽⾔最重要的就是跳出结构. 因为跳出了才可以有结果.所谓的递归就是化归思想递归的调⽤, 写递归函数, 最终还是要转换为⾃⼰这个函数.假如有⼀个函数 f, 如果它是递归函数的话, 那么也就是说函数体内的问题还是转换为 f 的形式.递归思想就是将⼀个问题转换为⼀个已解决的问题来实现function f() {... f( ... ) ...}例⼦: 1, 2, 3, 4, 5, ..., 1001. ⾸先假定递归函数已经写好, 假设是 foo. 即 foo( 100 ) 就是求 1 到 100 的和2. 寻找递推关系. 就是 n 与 n-1, 或 n-2 之间的关系: foo( n ) == n + foo( n - 1 )var res = foo( 100 );var res = foo( 99 ) + 100;3. 将递推结构转换为递归体function foo( n ) {return n + foo( n - 1 );}* 将求 100 转换为求 99* 将求 99 转换为求 98* ...* 将求 2 转换为求 1* 求 1 结果就是 1* 即: foo( 1 ) 是 14. 将临界条件加到递归体中function foo( n ) {if ( n == 1 ) return 1;return n + foo( n - 1 );}练习: 求 1, 3, 5, 7, 9, ... 第 n 项的结果与前 n 项和. 序号从 0 开始求第 n 项的1. ⾸先假定递归函数已经写好, 假设是 fn. 那么第 n 项就是 fn( n )2. 找递推关系: fn( n ) == f( n - 1 ) + 23. 递归体function fn( n ) {return fn( n-1 ) + 2;}4. 找临界条件求 n -> n-1求 n-1 -> n-2...求 1 -> 0求第 0 项, 就是 15. 加⼊临界条件function fn( n ) {if ( n == 0 ) return 1;return fn( n-1 ) + 2;}前n项和1. 假设已完成, sum( n ) 就是前 n 项和2. 找递推关系: 前 n 项和等于第 n 项 + 前 n-1 项的和3. 得到递归体function sum( n ) {return fn( n ) + sum( n - 1 );}4. 找临界条件n == 1 结果为 15. 得到递归函数function sum( n ) {if ( n == 0 ) return 1;return fn( n ) + sum( n - 1 );}练习: 2, 4, 6, 8, 10 第 n 项与前 n 项和第n项function fn( n ) {if ( n == 0 ) return 2;return fn( n-1 ) + 2;}前n项和function sum( n ) {if ( n == 0 ) return 2;return sum( n - 1 ) + fn( n );}练习: 数列: 1, 1, 2, 4, 7, 11, 16, … 求第 n 项, 求前 n 项和.求第 n 项1. 假设已经得到结果 fn, fn( 10 ) 就是第 10 项2. 找递推关系0, 1 => fn( 0 ) + 0 = fn( 1 )1, 2 => fn( 1 ) + 1 = fn( 2 )2, 3 => fn( 2 ) + 2 = fn( 3 )...n-1, n => fn( n-1 ) + n - 1 = fn( n )3. 递归体也就清楚了, 临界条件是 n == 0 => 1function fn( n ) {if ( n == 0 ) return 1;return fn( n-1 ) + n - 1;}如果从 1 开始表⽰, 那么第 n 项为1. 假设已经得到结果 fn, fn( 10 ) 就是第 10 项2. 找递推关系1, 2 => fn( 1 ) + 0 = fn( 2 )2, 3 => fn( 2 ) + 1 = fn( 3 )3, 4 => fn( 3 ) + 2 = fn( 4 )...n-1, n => fn( n-1 ) + n - 2 = fn( n )3. 临界条件 n == 1 => 1前n项和function sum( n ) {if ( n == 0 ) return 1;return sum( n - 1 ) + fn( n );}如果从 0 开始0 1 2 3 4 5 61, 1, 2, 4, 7, 11, 16,如果从 1 开始1 2 3 4 5 6 71, 1, 2, 4, 7, 11, 16,练习: Fibonacci 数列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …求其第 n 项.递推关系 fn(n) == fn( n- 1) + fn( n - 2)function fib( n ) {if ( n == 0 || n == 1 ) return 1;return fib( n - 1 ) + fib( n - 2 );}阶乘阶乘是⼀个运算, ⼀个数字的阶乘表⽰的是从 1 开始累乘到这个数字. 例如 3! 表⽰1 * 2 * 3. 5! 就是1 * 2 * 3 * 4 * 5. 规定 0 没有阶乘, 阶乘从 1 开始.求 n 的阶乘function foo ( n ) {if ( n == 1 ) return 1;return foo( n - 1 ) * n;}求幂求幂就是求某⼀个数⼏次⽅2*2 2 的平⽅, 2 的 2 次⽅求 n 的 m 次⽅最终要得到⼀个函数 power( n, m )n 的 m 次⽅就是 m 个 n 相乘即 n 乘以 (m-1) 个 n 相乘function power ( n, m ) {if ( m == 1 ) return n;return power( n, m - 1 ) * n;}深拷贝如果要实现深拷贝那么就需要考虑将对象的属性, 与属性的属性, ... 都拷贝过来如果要实现:1. 假设已经实现 clone( o1, o2 ), 将对象 o2 的成员拷贝⼀份交给 o12. 简单的算法, 将 o2 的属性拷贝到 o1 中去function clone( o1, o2 ) {for ( var k in o2 ) {o1[ k ] = o2[ k ];}}3. 找递推关系, 或叫划归为已经解决的问题假设⽅法已经实现, 问⼀下, 如果 o2[ k ] 是对象继续使⽤这个⽅法因此需要考虑的是 o2[ k ] 如果是引⽤类型, 再使⽤⼀次 clone() 函数如果 o2[ k ]不是引⽤类型, 那么就直接赋值function clone( o1, o2 ) {for ( var k in o2 ) {if ( typeof o2[ k ] == 'object' ) {o1[ k ] = {};clone( o1[ k ] , o2[ k ] );} else {o1[ k ] = o2[ k ];}}}复杂实现: clone( o ) -> newObjfunction clone( o ) {var temp = {};for ( var k in o ) {if ( typeof o[ k ] == 'object' ) {temp[ k ] = clone( o[ k ] );} else {temp[ k ] = o[ k ];}}return temp;}请⽤递归实现 getElementsByClassName<div><div>1<div class="c">2</div><div>3</div></div><div class="c">4</div><div>5<div>6</div><div class="c">7</div></div><div>8</div></div>1. 如果实现⼀个⽅法 byClass( node, 'c', list ), 表⽰在某⼀个节点上查找符合 class 属性为 c 的元素2. 在当前元素的⼦元素中查找, 如果有符合要求的, 存储到⼀个数组中3. ⾸先遍历⼦节点, 然后看⼦节点是否还有⼦节点, 如果没有直接判断, 如果有再递归function byClass( node, className, list ) {var arr = node.childNodes;for ( var i = 0; i < arr.length; i++ ) {if ( arr[ i ].className == className ) {list.push( arr[ i ] );}if ( arr[ i ].childNodes.length > 0 ) {byClass( arr[ i ], className, list );}}}。

递归练习题目

递归练习题目

1.求阶乘.输入n(0<n<50), 求n!并输出.2.Fibonacci数列问题描述:Fibonacci兔子问题是个经典问题:从某天开始把雌雄各一的一对小兔子放入养殖场中,小兔经过一个月长大,长大后,雌兔每月产雌雄各一的一对小兔。

每对新兔也是一个月长大,长大后每对新兔也是每月产一对兔子。

试问第n个月养殖场共有多少对兔子。

输入: n ,表示第n个月;输出: 输出从第一个月到第n个月的兔子数目的序列.样例: n=5输出: 1 1 2 3 53、Hanoi问题(汉诺塔)。

有n个圆盘,半径各不相同,依半径从大到小,自下而上套在A柱上,另还有B、C 两根空柱,现要求将A柱上的n个圆盘全部搬到C柱上去且每次只许搬动一个盘子,还必须始终保持每根柱子上是小盘在上,大盘在下。

编一个程序能够打印出移动过程。

4.棋子移动。

有2n个棋子(n>=4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如图(n=5):〇〇〇〇〇●●●●●移动棋子的规则是:每次必须同时移动移动相邻两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。

每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。

如n=5时,成为:〇●〇●〇●〇●〇●5、字母排列(组合)显示从前m(A-----第m个)个大写英文字母中取n个不同字母的所有排列(组合)。

6、自然数拆分一个整数n(n<=100)可以有多种分划,使其分划的一列整数之和为n。

例如:输入:n=6输出文件hs.out,格式内容为65 14 24 1 13 33 2 13 1 1 12 2 22 2 1 12 1 1 11 1 1 1 1 1total=11 {表示分划数有11种}7、数的一半(vijos 1130)要求找出具有下列性质的数的个数(包含输入的自然数n):先输入一个自然数n(n<=500),然后对此自然数按照如下方法进行处理:①. 不作任何处理;②. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;③. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.样例: 输入: 6满足条件的数为 6162612636136输出: 68、核电站问题(vijos 1232)一个核电站有N个放核物质的坑,坑排列在一条直线上。

《算法设计与分析》递归算法典型例题

《算法设计与分析》递归算法典型例题

算法递归典型例题实验一:递归策略运用练习三、实验项目1.运用递归策略设计算法实现下述题目的求解过程。

题目列表如下:(1)运动会开了N天,一共发出金牌M枚。

第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。

到了第N天刚好还有金牌N枚,到此金牌全部发完。

编程求N和M。

(2)国王分财产。

某国王临终前给儿子们分财产。

他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i 个儿子i份,再加上剩余财产的1/10。

每个儿子都窃窃自喜。

以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。

请用程序回答,老国王共有几个儿子?财产共分成了多少份?源程序:(3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。

问这鱼缸里原有多少条金鱼?(4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少?(5)猴子吃桃。

有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子?(6)小华读书。

第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少页?(7)日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。

二阶递归数列应用题

二阶递归数列应用题

二阶递归数列应用题一、二阶递归数列的定义和性质二阶递归数列是一种特殊的数列,其通项公式具有递归的形式。

一般来说,形式为an = f(an-1, an-2)的数列称为二阶递归数列。

在实际应用中,二阶递归数列常常出现在动态规划、计算机科学、数学建模等领域。

了解二阶递归数列的性质和求解方法,有助于我们更好地解决实际问题。

二、解决二阶递归数列问题的常用方法1.构造法:通过构建特定的数学模型,将原问题转化为二阶递归数列问题。

2.递推法:根据二阶递归数列的定义,通过递推关系式求解数列的项。

3.迭代法:利用迭代思想,逐步求解二阶递归数列的项。

4.矩阵求解法:将二阶递归数列问题转化为矩阵运算问题,利用矩阵的性质求解。

三、实例分析以下举例说明如何运用上述方法解决二阶递归数列问题:题目:已知数列{an}满足an = 3an-1 + 2an-2,a1 = 1,a2 = 2,求数列的前10项。

解:首先,我们可以通过迭代法求解该二阶递归数列。

1.初始化递推关系式:a0 = 1,a1 = 2。

2.迭代求解:a3 = 3a2 + 2a1 = 3*2 + 2*1 = 8,a4 = 3a3 + 2a2 = 3*8 + 2*2 = 26,a5 = 3a4 + 2a3 = 3*26 + 2*8 = 90,……a10 = 3a9 + 2a8。

3.输出结果:数列的前10项为1, 2, 8, 26, 90, 296, 882, 2666, 8028, 24286。

四、结论与启示通过以上分析,我们可以得出以下结论:1.二阶递归数列在实际应用中具有广泛性,掌握其性质和求解方法有助于解决实际问题。

2.解决二阶递归数列问题有多种方法,如构造法、递推法、迭代法和矩阵求解法等,可以根据具体问题选择合适的方法。

3.实例分析表明,运用迭代法求解二阶递归数列问题简单易懂,易于实现,具有一定的实用性。

总之,了解二阶递归数列的定义和性质,掌握解决其问题的方法,能够帮助我们更好地应对实际问题。

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

1、求菲波拉契数列的第10项的值。

已知a0=0,a1=1,a2=a0+a1,a3=a1+a2…将第n项的a(n)写成递归函数计算。

program ex1 (input,output);
function a(n:integer):integer;
begin
if n=0
then a:=0
else if
then
else
end;
begin
writeln(a(9))
end.
2.汉诺塔游戏。

program ex2(input,output);
var total:integer;
procedure move(n,a,b,c:integer);
begin
if
then writeln(a,’→’,c)
else begin
;
writeln(a,’→’,c);
end
end;
begin
read(total);
move(total,1,2,3)
end.
3.顺序读入字符,以‘?’结束,然后以和输入相反的次序输出读入字符。

program ex3 (input,output);
procedure receive;
var ch:char;
begin
read(ch);
if
then ;
end;
begin
receive
end. 4.求两数的最大公约数
program ex4 (input,output);
var m,n,g:integer;
function gcd(m,n:integer):integer;
begin
if
then gcd:=m
else
end;
begin
read(m,n);g:=gcd(m,n); writeln(‘gcd=’,g)
end.
5.计算x n。

x,n由键盘输入。

program ex5(input,output);
var x,y:real; n:integer;
function f(x :real; n:integer):real;
begin
if n=0
then
else if n>0
then
else
end;
begin
read(x,n); y:=f(x,n); writeln(‘y=’,y) end.
6.有雌雄一对小免子,假定两个月便可繁殖雌雄
各一的一对小免子。

如果年初在饲养场放一对小
免,N个月后共有多少对免子?
program ex4 (input,output);
var n:integer;
function f(n:integer):longint;
begin
if
then f:=1
else
end;
begin
readln(n); writeln( f(n) ); readln;
end.
7.楼梯有N阶台阶,上楼可以一步上一阶,也可
以一步上二阶。

写一程序计算共有多少种不同走
法。

program ex7 (input,output);
var
n :integer;
y:longint;
function find(n:byte):longint;
begin
if n<3
then
else
end;
begin
readln(n); y:=find(n); writeln(‘y=’,y)
end.
8. 有2×n的一个长方形方格,用一个1×2的骨
牌铺满方格。

例如n=3时,为2×3方格。

此时用一个1×2的骨牌铺满方格,共有3种铺法:试对给出的任意
一个n(n)0),求出
铺法总数的递推
公式。

9..有1*n的一个长方形,用一个1*1,1*2和1*3的骨牌铺满方格。

例如当n=3时,为1*3的方格。

此时用1*1,1*2和1*3的骨牌铺满方格,共有四种铺法。

输入n(0<=n<=30)。

输出铺法总数。

program ex6(input,output);
var n:integer;
function f (i:integer) :longint;
begin
if
then
else if
then
else ;
end;
begin
readln(n); writeln(f(n)) ;
end.
10. 从键盘输入一个多位数,用递归方法把这个多位数倒过来输出。

program ex10 (input,output);
var number:integer;
procedure rd (number:integer); begin
write( :1); number:=number div 10;
if
then rd(number);
end;
begin
readln(n); rd(number); readln; end.
11.用递归方法求:
c=1+1/x+1/x2+1/x3+1/x4+…(x>1)
若1/x n<=0.000001,则停止运算。

program zdzx5 (input,output);
var x,c:real;
procedure ser (a:real);
begin
a:=a*x;
c:= ;
if then ser (a) end;
begin
readln(x);
x:=1/x; c:=1+x; ser(x);
writeln(‘c=’,c:8:6)
end.。

相关文档
最新文档