Ackermann函数的递归求值
描述
已知Ackermann函数定义如下:
写出计算Ack(m,n)的递归算法。
输入
多组数据,每组数据有一行,为两个整数m和n。当m和n都等于0时,输入结束。
输出
每组数据输出一行,为Ack(m,n)。
输入样例 1
3 5 3 10 0 0输出样例 1
253 8189#include<iostream> using namespace std; int Ack(int m,int n) { if(m==0) return n+1; else if(m>0&&n==0) return Ack(m-1,1); else if(m>0&&n>0) return Ack(m-1,Ack(m,n-1)); } int main() { int m,n; while(cin>>m>>n&&m!=0&&n!=0) cout<<Ack(m,n)<<endl; return 0; }
Ackermann函数的非递归求值
描述
已知Ackermann函数定义如下:
写出计算Ack(m,n)的非递归算法。
输入
多组数据,每组数据有一行,为两个整数m和n。当m和n都等于0时,输入结束。
输出
每组数据输出一行,为Ack(m,n)。
输入样例 1
2 1 0 0输出样例 1
5#include<iostream> using namespace std; #define Max 100 int Ack(int m,int n) { int A[m+1][Max]; for(int i=0;i<Max;i++) A[0][i]=i+1; for(int i=1;i<=m;i++) { A[i][0]=A[i-1][1]; for(int j=1;j<Max;j++) A[i][j]=A[i-1][A[i][j-1]]; } return A[m][n]; } int main() { int m,n; while(cin>>m>>n&&m!=0&&n!=0) cout<<Ack(m,n)<<endl; return 0; }
递归求解单链表中的最大值
描述
利用单链表表示一个整数序列,利用递归的方法求出单链表中整数的最大值。
输入
多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。
输出
对于每组数据分别输出一行,输出每个链表的最大值。
输入样例 1
4 1 2 3 4 5 -1 2 39 2 3 0输出样例 1
4 39
#include<bits/stdc++.h> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; void TailCreate(LinkList &l,int n) { l=new LNode; l->next=NULL; LNode *s,*r=l; for(int i=0;i<n;i++) { int x; cin>>x; s=new LNode; s->data=x; r->next=s; r=s; } r->next=NULL; } void Print(LinkList l) { LNode *p=l->next; while(p!=NULL) { cout<<p->data; if(p->next) { cout<<" "; } p=p->next; } cout<<endl; } int Max(LinkList l) { if(l->next==NULL) { return l->data; } else { if(l->data>=Max(l->next)) { return l->data; } else { return Max(l->next); } } } int main() { int n; while(cin>>n&&n!=0) { LinkList l; TailCreate(l,n); cout<<Max(l->next)<<endl; } }
递归求解单链表中的结点个数
描述
利用单链表表示一个整数序列,利用递归的方法计算单链表中结点的个数。
输入
多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。
输出
对于每组数据分别输出一行,对应链表中的各个结点个数。
输入样例 1
4 1 2 3 4 6 1 2 43 5 7 2 0输出样例 1
4 6#include<bits/stdc++.h> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; void TailCreate(LinkList &l,int n) { l=new LNode; l->next=NULL; LNode *s,*r=l; for(int i=0;i<n;i++) { int x; cin>>x; s=new LNode; s->data=x; r->next=s; r=s; } r->next=NULL; } void Print(LinkList l) { LNode *p=l->next; while(p!=NULL) { cout<<p->data; if(p->next) { cout<<" "; } p=p->next; } cout<<endl; } int Length(LinkList l) { if(l==NULL) { return 0; } else { return Length(l->next)+1; } } int main() { int n; while(cin>>n&&n!=0) { LinkList l; TailCreate(l,n); cout<<Length(l->next)<<endl; } }
递归求解单链表中的平均值
描述
利用单链表表示一个整数序列,利用递归的方法计算单链表中各个结点的平均值。
输入
多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。
输出
对于每组数据分别输出一行,对应链表中的各个结点的平均值,输出保留两位小数。
输入样例 1
4 1 2 3 4 6 1 1 1 1 1 1 0输出样例 1
2.50 1.00#include<bits/stdc++.h> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; void TailCreate(LinkList &l,int n) { l=new LNode; l->next=NULL; LNode *s,*r=l; for(int i=0;i<n;i++) { int x; cin>>x; s=new LNode; s->data=x; r->next=s; r=s; } r->next=NULL; } void Print(LinkList l) { LNode *p=l->next; while(p!=NULL) { cout<<p->data; if(p->next) { cout<<" "; } p=p->next; } cout<<endl; } double Average(LinkList l,int n) { if(l->next==NULL) { return l->data; } else { return (l->data+Average(l->next,n-1)*(n-1))/n; } } int main() { int n; while(cin>>n&&n!=0) { LinkList l; TailCreate(l,n); cout<<fixed<<setprecision(2)<<Average(l->next,n)<<endl; } }