递归算法
1.已知数列:1 4 7 10 13 16 19 ......请输出前n项的值,每一项以空格隔开. #include
using namespace std; int n; int f(int x,int y){ cout<
=n)return 0; f(x+1,y+3); } int main(){ cin>>n; f(1,1); return 0; } 作业:数列:2 5 11 23 47 95 191......的第2项为5,那么第n项为多少? 2.求1+2+3+..+n=? 方法1: #include
using namespace std; int f(int k){ if (k==1)return 1; else return f(k-1)+k; } int main(){int n; cin>>n; int s=f(n); cout<
using namespace std; int n; int f(int x,int s){ if(x==n)return s; x=x+1; f(x,s+x); } int main(){ cin>>n; int k=0; k=f(0,0); cout<
using namespace std; int f(int k){ if (k==1)return 1; if(k==2)return 2; return f(k-1)+f(k-2); } int main(){ int n; cin>>n; cout<
using namespace std; int n; int f(int k,int x,int y,int z){ //cout<
=n)return z; f(k+1,y,z,y+z); } int main(){ cin>>n; if n<=2 cout<
using namespace std; int n; int f(int k,int x,int y,int z){//k表示当前来到数列第k项,x表示当前项处于第x周期,y是当前项处于当前周期中的第y项,z表示当前项的值 // cout<
>n; cout<
#include
using namespace std; string s; int n; int f(int k){ if (k
using namespace std; int a[10000]={0}; int f(int l,int r,int x){ int k=(l+r)/2; if(l>r)return -1; if(a[k]==x)return k; if(x
using namespace std; int ans=0; void f(int x){ ans++; for(int i=1;i<=x/2;i++) f(i); } int main(){ int n; scanf("%d",&n); f(n); printf("%d",ans); return 0; } 8.把自然数m分解为若干个自然数的和,输出每一种分法,从小到大排列. 样例: 输入:5 输出: 5=1+1+1+1+1 5=1+1+1+2 5=1+1+3 5=1+2+2 5=1+4 5=2+3 5=5 #include
using namespace std; int a[1000]={0}; int m; int f(int k,int n){ if(n==0){ cout<
>m; a[0]=1; f(1,m); return 0; } 作业1:把自然数m分解为若干个不同自然数的和,输出每一种分法,从小到大排列. 输入:10 输出: 10=1+2+3+4 10=1+2+7 10=1+3+6 10=1+4+5 10=1+9 10=2+3+5 10=2+8 10=3+7 10=4+6 10=10 作业2:把自然数m分解为若干个自然数的平方和,输出每一种分法,从小到大排列. 输入:9 输出: 9=1*1+1*1+1*1+1*1+1*1+1*1+1*1+1*1+1*1 9=1*1+1*1+1*1+1*1+1*1+2*2 9=1*1+2*2+2*2 9=3*3 9. 有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。 输入格式 : 第一行,一个整数,表示箱子容量; 第二行,一个整数,表示有n个物品; 接下来n行,分别表示这n个物品的各自体积。 输出格式: 一个整数,表示箱子剩余空间 #include
#include
using namespace std; int v=20000,m,n,a[100]={0}; int f(int k,int t){ if(k>n){if(t
=a[k])f(k+1,t-a[k]); f(k+1,t); } int main(){ cin>>m>>n; for(int i=1;i<=n;i++)cin>>a[i]; f(1,m); cout<
#include
#include
using namespace std; int visit ( int, int ); int maze[100][100] ={0}; int m,n; int startI, startJ ; // 入口 int endI, endJ; // 出口 int success = 0; int main ( ) { int i, j; cin>>m>>n; cin>>startI>>startJ; cin>>endI>>endJ; for(i=1;i<=m;i++) for(j=1;j<=n;j++) cin>>maze[i][j]; for ( i = 0; i <=n+1; i++ ) { maze[0][i]=2; maze[m+1][i]=2; } for ( i = 0; i <=m+1; i++ ) { maze[i][0]=2; maze[i][n+1]=2; } if ( visit ( startI, startJ ) == 0 ) printf ( "\n没有找到出口!\n" ); else { printf ( "\n显示路径:\n" ); for ( i = 0; i <= m+1; i++ ) { for ( j = 0; j <=n+1; j++ ) { if ( maze[i][j] == 2 ) printf ( "█" ); else if ( maze[i][j] == 1 ) printf ( "◇" ); else printf ( " " ); } printf ( "\n" ); } } return 0; } int visit ( int i, int j ) { maze[i][j] = 1; if ( i == endI && j == endJ ) success = 1; if ( success != 1 && maze[i][j+1] == 0 ) visit ( i, j+1 ); if ( success != 1 && maze[i+1][j] == 0 ) visit ( i+1, j ); if ( success != 1 && maze[i][j-1] == 0 ) visit ( i, j-1 ); if ( success != 1 && maze[i-1][j] == 0 ) visit ( i-1, j ); if ( success != 1 ) maze[i][j] = 0; return success; }