1.了解递归的作用:
递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。
2.能解决的问题:
数据的定义是按递归定义的。如Fibonacci函数。
问题解法按递归算法实现。如Hanoi问题。
数据的结构形式是按递归定义的。如二叉树、广义表等
3.结构:
一递一归;
必须有结束条件
4.实际代码:(最为基础)
(函数类型) 函数名
{
if(结束条件)
{
return ...(按你的题描述来写);
}
else
{
return ...(调用自己);
}
}
5.实战演练
1.
汉诺塔问题
时间限制:1秒 内存限制:128M
题目描述
设有n个大小不等的中空圆盘,按照从小到大的顺序叠套在立柱A上,另有两根立柱B和C。现在要求把全部圆盘从A柱(称为源柱)移到C柱(称为目标柱),移动过程中可借助B柱(称为中间柱)。移动时有如下的要求:
1) 一次只许移动一个盘。
2) 任何时候、任何柱子上不允许把大盘放在小盘上边
3) 可使用任意一根立柱暂存圆盘。
问:如何用最少步数实现n个盘子的移动?请打印出具体的移动方案
输入描述
一行一个正整数n,1<=n<=18
输出描述
输出若干行,第i行表示第i步的移动方案
样例
输入
3
输出
A->C
A->B
C->B
A->C
B->A
B->C
A->C
这道题较为经典
AC:
#include <iostream>
using namespace std;
void f(char A,char B,char C,int n){
if (n!=0){
f(A,C,B,n-1);
cout<<A<<"->"<<C<<endl;
f(B,A,C,n-1);
}
}
int main(){
int n;
cin>>n;
f('A','B','C',n);
return 0;
}
斐波那契数列
时间限制:1秒 内存限制:128M
题目描述
输入n,1<=n<=1000,输出斐波那契数列第n项模9997的值
输入描述
输入n
输出描述
输出斐波那契数列第n项模9997的值
样例
输入
10
输出
55
这道题也用递归:
AC:
#include<bits/stdc++.h>
using namespace std;
int a[1005]={0};
int fun(int n){
if(a[n]!=0){
return a[n];
}
if(n==1||n==2){
return a[n]=1;
}
else{
return a[n]=fun(n-1)%9997+fun(n-2)%9997;
}
}
int main(){
int n;
cin>>n;
cout<<fun(n)%9997;
return 0;
}
都看到这了,难道不点个赞或关注一下?