递归算法习题
- 格式:pdf
- 大小:516.09 KB
- 文档页数:3
生活中递归的例子
1.阶乘计算:在数学中,n!(n的阶乘)等于1*2*3*…*n。
递归地可以表示为:如果n等于0或1,则返回1;否计算n*(n-1)的阶乘。
2. 斐波那契数列:Fibonacci数列包括有趣的性质,每个数字都是前两个数字的和。
递归可以表示为:如果n等于0或1,则返回n;否则返回Fibonacci(n-1)+Fibonacci(n-2)。
3.文件夹的计数:计算文件夹下的所有文件和子文件夹的数量。
递归的思路是,对于每个文件夹,计算它下面的文件数量和每个子文件夹的数量。
递归结束条件是计算到了一个没有子文件夹的文件夹。
4.数组反转:将数组中的元素反转。
递归思路是,将首尾两个元素交换,并对剩余的元素进行递归操作。
递归结束条件是数组为空或只有一个元素。
5.树的遍历:树是一个由节点组成的层级结构。
有三种主要的遍历方式:前序遍历,中序遍历和后序遍历。
其中,前序遍历先遍历父节点,再遍历左子树和右子树。
中序遍历先遍历左子树,再遍历父节点和右子树。
后序遍历先遍历左子树,再遍历右子树和父节点。
对于每个节点,遍历操作可以递归地应用到它的左右子树中。
Fibonacci数列、集合全排列和整数划分问题Fibonacci数列Fibonacci数列是一个由0和1开始,每个后续数字等于前两个数字之和的数列。
以下是Fibonacci数列的递归算法实现:// 递归实现Fibonacci数列function fibonacci(n) { if (n <= 1){ return n; } return fibonacci(n - 1) + fibonacci(n - 2);}集合全排列集合全排列问题是指给定一个集合,求该集合中元素的全排列。
以下是集合全排列的递归算法实现:// 递归实现集合全排列function permute(arr, start = 0) { if (start === arr.length) { console.log(arr); // 输出当前排列 } for (let i = start; i < arr.length; i++) { // 交换当前元素与起始位置元素 [arr[start], arr[i]] = [arr[i], arr[start]]; permute(arr, start + 1); // 递归调用下一次排列 [arr[start],arr[i]] = [arr[i], arr[start]]; // 恢复当前元素与起始位置元素的交换 }}整数划分整数划分问题是指将一个整数拆分成多个正整数的和,求所有的划分方式。
以下是整数划分的递归算法实现:// 递归实现整数划分function partition(n, max, prefix = []) { if (n === 0) { console.log(prefix); // 输出当前划分 } for (let i = Math.min(max, n); i >= 1; i--) { partition(n - i, i, [...prefix, i]); // 递归调用下一次划分 }}。
递归的经典例子
1. 算数学题的时候啊,像计算一个数的阶乘,这就是一个递归的经典例子呀!比如说计算 5 的阶乘,不就是 5 乘以 4 的阶乘嘛,而 4 的阶乘又等于 4 乘以 3 的阶乘,依次类推,这多有意思啊!
2. 还有走迷宫呢,你想想,当你在迷宫里遇到岔口,你选择一条路走,然后又遇到岔口,又继续选择,这不就跟递归很像嘛!你不断地进入更小的问题去探索,直到找到出口,这难道不是很神奇吗?
3. 画树也可以用递归呀!先画一个树干,然后树干上又分出树枝,每个树枝又可以当作新的树干去继续分树枝,这不就跟递归的过程一样嘛,哇塞,这样就能画出一棵复杂又漂亮的树啦!
4. 你知道汉诺塔游戏不?那就是典型的递归例子哟!要把盘子从一个柱子移到另一个柱子,不就得不断地用递归的方法去解决嘛,天啊,真是好烧脑又好有趣!
5. 再来说说我们电脑里的文件系统,那也是递归的体现呀!文件夹里有子文件夹,子文件夹里还有子文件夹,就这么一层层下去,像不像递归在大展身手呢?
6. 回忆一下我们看电影的时候,很多故事里不是也有类似递归的情节嘛!主角解决一个问题又引出新的问题,然后一直这么循环,这也可以说是一种故事里的递归呀,多有意思的发现呀!
总之,递归在生活中无处不在,它就像一把神奇的钥匙,能打开很多复杂问题的大门,给我们带来惊喜和挑战!。
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)的和。
c语言递归试题及答案C语言递归试题及答案1. 问题描述:编写一个C语言函数,使用递归方法计算一个整数n的阶乘。
2. 函数原型:```cint factorial(int n);```3. 递归函数实现:```cint factorial(int n) {if (n <= 1) {return 1;} else {return n * factorial(n - 1);}}```4. 测试代码:```c#include <stdio.h>int factorial(int n);int main() {int n = 5;printf("The factorial of %d is %d\n", n, factorial(n)); return 0;}```5. 答案:当输入为5时,程序输出应为:```The factorial of 5 is 120```6. 问题分析:阶乘函数是一个经典的递归问题。
递归函数`factorial`通过检查参数`n`是否小于等于1来决定是否结束递归。
如果`n`为1或更小,函数返回1,因为1的阶乘是1。
否则,函数调用自身计算`n-1`的阶乘,并将结果乘以`n`。
7. 注意事项:- 递归函数必须有一个明确的退出条件,否则会导致无限递归。
- 递归深度过大时可能会导致栈溢出。
8. 扩展问题:如何使用递归方法计算斐波那契数列的第n项?9. 斐波那契数列递归函数实现:```cint fibonacci(int n) {if (n <= 1) {return n;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}```10. 斐波那契数列测试代码:```c#include <stdio.h>int fibonacci(int n);int main() {int n = 10;printf("The %dth Fibonacci number is %d\n", n, fibonacci(n));return 0;}```11. 斐波那契数列答案:当输入为10时,程序输出应为:```The 10th Fibonacci number is 55```12. 斐波那契数列问题分析:斐波那契数列是一个每一项都是前两项和的序列,定义为:F(0)= 0, F(1) = 1, F(n) = F(n-1) + F(n-2)。
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])```这些题目可以帮助你理解递归的概念和应用。
请注意,在实际的编程中,代码的效率可能需要进行优化,以避免递归的深度过深导致的堆栈溢出。
简单递归例子
1. 嘿,你知道计算阶乘吧,那就是个简单递归例子呀!比如说,计算 5 的阶乘,不就是 5 乘以 4 的阶乘嘛,4 的阶乘又是 4 乘以 3 的阶乘,一直
这样递推下去,直到 1 的阶乘就是 1,多神奇呀!
2. 哎呀呀,斐波那契数列也是呢!前两个数是 0 和 1,后面每个数都
是前两个数的和,这就是妥妥的递归呀!你想想,像不像搭积木,一层一层搭起来的感觉。
3. 还有走迷宫!当你在一个岔路口选择一条路走下去,如果碰到死胡同,就回到岔路口再选另一条路,这也有点递归的味道啊,是不是很有意思呢?
4. 你看画树的例子呀!先画一个主干,然后从主干上再长出分支,每个分支又可以长出更小的分支,这不就是用递归在构建嘛!
5. 计算最大公约数也能用递归呢!如果两个数不相等,就把大的数变成大的数减去小的数,小的数不变,然后再去算,这不就是在反复进行一个过程嘛,多酷!
6. 就说汉诺塔问题吧!把盘子从一个柱子移动到另一个柱子,不也得靠递归的思路嘛!这就像接力赛,一环扣一环的。
7. 像倒着数数也是呀!从 10 数到 1,不就是每次减去 1 然后接着数,这也是一种简单的递归呀!
8. 你瞧,生活中好多地方都有递归的影子呢!这真的很神奇,不是吗?简单的递归例子就在我们身边呀,让我们发现更多有趣的递归吧!
我的观点结论:递归在很多地方都有体现,而且非常有趣,大家可以多多留意去发现呀。
递归算法的经典例子
斐波那契数列:斐波那契数列又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。
递归算法的核心思想是将一个问题的求解,转化为求解其子问题,以此达到解决原问题的目的,这正是斐波纳契数列求解过程中所采用的方法。
我们用函数fib(n)表示第n个斐波那契数:
def fib(n):。
if n == 0:。
return 0。
elif n == 1:。
return 1。
else:。
return (fib(n-1) + fib(n-2))。
递归函数的步骤:1、定义函数的结束条件;2、定义功能;3、以函数的形式调用自身,逐级求解问题。
解决斐波纳契数列的问题,本质上就是求解一系列递推关系式,这正是递归算法的典型应用场景。
斐波纳契数列有两种实现方案,一种是使用循环实现,一种是使用递归实现。
相比而言,采用递归实现来求解斐波纳契数列,更为简单,容易理解,更加贴近数学本质,也更容易使用。
第5章递归1.有以下递归函数:分析调用fun(5)的输出结果。
答:调用递归函数fun(5)时,先递推直到递归出口,然后求值。
这里的递归出口语句是,递推时执行的语句是,求值时执行的语句是调用fun(5)的输出结果如下:2.已知A[n]为整数数组,编写一个递归算法求n个元素的平均值。
答:设avg(A,i)返回A[0..i]这i+1个元素的平均值,则递归模型如下:对应的递归算法如下:求A[n]中n个元素平均值的调用方式为:avg(A,n-1)。
3.设计一个算法求整数n的位数。
答:设f(n)为整数n的位数,其递归模型如下:对应的递归算法如下:4.设有一个不带表头节点的单链表L,其节点类型如下:设计如下递归算法:(1)求以L为首节点指针的单链表的节点个数。
(2)正向显示以L为首节点指针的单链表的所有节点值。
(3)反向显示以L为首节点指针的单链表的所有节点值。
(4)删除以L为首节点指针的单链表中值为x的第一个节点。
(5)删除以L为首节点指针的单链表中值为x的所有节点。
(6)输出以L为首节点指针的单链表中最大节点值。
(7)输出以L为首节点指针的单链表中最小节点值。
答:根据单链表的基本知识,设计与各小题对应的递归算法如下:(1)(2)(3)(4)(5)(6)(7)上机实验题5实验题1 编写一个程序exp5-1.cpp,求解皇后问题:在n×n的方格棋盘上,放置n 个皇后,要求每个皇后不同行、不同列、不同左右对角线。
要求:(1)皇后的个数n由用户输入,其值不能超过20,输出所有的解。
(2)采用递归方法求解。
实验题2编写一个程序exp5-2.cpp,求解背包问题:设有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量,但选中物品的总价值最大。
常见递归数列通项公式的求解策略数列是中学数学中重要的知识之一,而递归数列又是近年来高考和全国联赛的重要题型之一。
数列的递归式分线性递归式和非线性递归式两种,本文仅就高中生的接受程度和能力谈谈几种递归数列通项公式的求解方法和策略。
一、周期数列如果数列满足:存在正整数M、T,使得对一切大于M的自然数n,都有成立,则数列为周期数列。
例1、已知数列满足a1 =2,an+1 =1-,求an 。
解:an+1 =1-an+2 =1-=-, 从而an+3 = 1-=1+an-1=an ,即数列是以3为周期的周期数列。
又a1 =2,a2=1-=, a3 =-12 , n=3k+1所以an= ,n=3k+2 ( kN )-1 , n=3k+3二、线性递归数列1、一阶线性递归数列:由两个连续项的关系式an= f (an-1 )(n,n)及一个初始项a1所确定的数列,且递推式中,各an都是一次的,叫一阶线性递归数列,即数列满足an+1 =f (n) an+g(n),其中f (n)和g(n)可以是常数,也可以是关于n 的函数。
(一)当f (n) =p 时,g(n) =q(p、q为常数)时,数列是常系数一阶线性递归数列。
(1)当p =1时,是以q为公差的等差数列。
(2)当q=0,p0时,是以p为公比的等比数列。
(3)当p1且q0时,an+1 =p an+q可化为an+1-=p(an-),此时{an-}是以p为公比,a1-为首项的等比数列,从而可求an。
例2、已知:=且,求数列的通项公式。
解:=-=即数列是以为公比,为首项的等比数列。
(二)当f(n),g(n)至少有一个是关于n的非常数函数时,数列{an}是非常系数的一阶线性递归数列。
(1)当f(n) =1时,化成an+1=an+g(n),可用求和相消法求an。
例3、(2003年全国文科高考题)已知数列{an}满足a1=1,an=3n--1+an -1 (n2) , (1)求a2 ,a3 ; (2) 证明:an= .(1)解:a1 =1, a2=3+1=4 , a3=32+4=13 .(2)证明:an=3n--1+an-1 (n2) ,an-an-1=3n—1 ,an-1-an-2=3n—2 ,an-2-an-3=3n—3……,a4-a3=33 ,a3-a2=32 ,a2-a1=31将以上等式两边分别相加,并整理得:an-a1=3n—1+3n—2+3n—3+…+33+32+31 ,即an=3n—1+3n—2+3n—3+…+33+32+31+1= .(2)当g(n)=0时,化为a n+1=f(n) an ,可用求积相消法求an 。
hanoi塔递归算法Hanoi塔问题是一道经典的递归问题,它源于印度传说中的一个古老故事。
这个故事讲述了一个寺庙里有三根柱子,其中一根柱子上有64个盘子,从小到大依次放置。
寺庙里的僧人们每天都要把这些盘子从一根柱子移动到另一根柱子上,并且规定在移动过程中不能把大盘子放在小盘子的上面。
这个问题的挑战在于如何用最少次数将所有盘子从起始柱移动到目标柱。
1. 问题描述假设有三根柱子,分别为A、B、C,其中A柱上有n个圆盘,大小依次递增。
现在需要将A柱上的所有圆盘移动到C柱上,可以借助B柱作为中转站,但是需要满足以下条件:1. 每次只能移动一个圆盘;2. 圆盘可以放置在空柱或者比它大的圆盘上;3. 需要保证始终满足第2条规则。
求解该问题所需最少步骤。
2. 递归算法实现Hanoi塔问题可以使用递归算法来进行求解。
递归算法的基本思路是将一个大问题分解成若干个小问题,通过不断递归调用函数来解决这些小问题。
对于Hanoi塔问题,我们可以将其分解成三个步骤:1. 将n-1个圆盘从A柱移动到B柱;2. 将第n个圆盘从A柱移动到C柱;3. 将n-1个圆盘从B柱移动到C柱。
这样一来,原问题就被分解成了三个规模更小的子问题。
对于每一个子问题,我们可以继续按照同样的方式进行分解,直到规模变得足够小,可以直接求解为止。
下面是Hanoi塔递归算法的实现代码:```void hanoi(int n, char A, char B, char C) {if (n == 1) {cout << "Move disk " << n << " from " << A << " to " << C << endl;} else {hanoi(n - 1, A, C, B);cout << "Move disk " << n << " from " << A << " to " << C << endl;hanoi(n - 1, B, A, C);}}```其中,参数n表示当前需要移动的圆盘数量;参数A、B、C表示三根柱子的名称。
递归考纲里面貌似没有把递归单独明确写出来,不过作为算法的一种思想,我觉得还是挺重要的,而且貌似有时候也不那么简单。
我对一些非常常见的问题总结了一下,希望能帮助大家理解。
如果有认为过于难的题目,可以不做要求。
1、先看一个简单的:阶乘long Factorial (long n ) {if ( n == 0 )return 1;else return n*Factorial (n-1);}2、再看一个依旧白痴的题目:Fibonacci numbers(斐波那契数列)long Fib (long n ) {if ( n <= 1 )return n;else return Fib (n-1) + Fib (n-2);}3、稍微难点的的:汉诺塔问题分解:要把n个盘子从A借助于B移动到C,要先把n-1个盘子从A借助C移动到B,然后把第n个盘子直接移到C上面,之后再把n-1个盘子从B借助A移动到C,这样就把n的问题分解成n-1的问题。
void Hanoi (int n,int A,int B,int C ) { //把n个盘子,从A借助B移到C if ( n == 1 ) cout << " move " << A << " to "<< C << endl;else {Hanoi ( n-1, A, C, B );cout << " move " << A << " to " << C << endl;Hanoi ( n-1, B, A, C );}}4、来一个大家有些头疼的问题:迷宫问题问题分析:在迷宫里面你无非有4个选择,前走、后走、左走、右走。
如果有一个数组visited[][]记录你已经走过那些路了,那么是不是能出去了呢?//row,col记录当前在迷宫中的位置, out为是否走出迷宫的标志Maz(int row, int col, bool visited[][], bool &out){if(out) return;if(row<0||col<0||visited[row][col]) return; //不合法的路和走过的路都不再走定义一个bool v[][] 数组,并把visited复制过来;//想想为什么要这样做if(row和col是出口) {out=ture;return;}else{v[row][col]=1;Maz(row+1, col, v, out); //下走Maz(row-1, col, v, out); //上走Maz(row, col+1, v, out); //右走Maz(row, col-1, v, out); //左走}}5、最后一个问题:八皇后问题(有点难,可以不看)描述:把八个皇后棋放到8*8棋盘上,要求不能有任何两个皇后同行或者同列,也不能有任何两个皇后在其彼此的斜对角线上的格子里面,下面两种摆放方式都是合法的。