关于Ackermann函数非递归的个人实现

写了一两天的样子,还是太菜了。

Ackerman函数规则:

Ack(m,n)=n+1(m==0时);Ack(m-1,1)(n==0且m!=0时);Ack(m-1,Ack(m,n-1))其他情况;

在网上查到的实现方法似乎有的在用goto label之类的语法,看起来有点乱,所以没有采用这样的方法。自己写了一个栈的结构体以及pop、push函数等,初学者看着应该会比较舒服一点。

就是说用了个chec_pos的变量来记录嵌套运算的点,不知道算不算取巧🤔。

#include<stdio.h>
int Ack(int m,int n){
	int ans;
	if(m==0){
		printf("Arc(%d,%d)=%d\n",m,n,n+1);
		return n+1;
	}
	if(n==0){
		ans = Ack(m-1,1);
		printf("Arc(%d,%d)=%d\n",m,n,ans);
		return ans;
	} 
		ans = Ack(m-1,Ack(m,n-1));
		printf("Arc(%d,%d)=%d\n",m,n,ans);
		return ans;
}
typedef struct stack{
	int m,n,val,chec_pos;
	stack* tail;
	stack* next; 
}Stack,*VEC;
void Build(VEC &head){
	head=new stack;
	head->next=new stack;head->next->chec_pos=0;
	head->tail=head->next;
}
int isempty(VEC head){
	return (head->next==head->tail);
}
void new_stack(VEC &head,int m,int n,int val){
	VEC New=new stack;New->m=m;New->n=n;New->val=val;
	New->next=head->next;
	head->next=New;
}
void push(VEC &head,int m,int n,int chec_pos){
	VEC New=new stack;New->m=m;New->n=n;New->chec_pos=chec_pos;
	New->next=head->next;
	head->next=New;
}
void pop(VEC &head){
	VEC linshi;linshi=head;
	head->next->tail=head->tail;
	head=head->next;
	delete linshi;
}
void inline show(VEC Head){
	printf("\nAck(%d,%d) for %d\n",Head->next->m,Head->next->n,Head->next->chec_pos);
	return;
}
void Ack_(int m,int n,VEC &Head){
	int ans=0;
	push(Head,m,n,0);
while(1){
	if(Head->next->m==0){
		ans=Head->next->n+1;
		while(Head->next->chec_pos==0){
			if(isempty(Head))break;
			printf("Ack(%d,%d):\t%d\n",Head->next->m,Head->next->n,ans);
			pop(Head);
		}
		if(isempty(Head))break;
		if(Head->next->chec_pos==1){
			printf("Ack(%d,%d):\t%d\n",Head->next->m,Head->next->n,ans);
			Head->next->n=ans,Head->next->m-=1,Head->next->chec_pos=0;
		}
		continue;
	}
	if(Head->next->n==0){
		push(Head,Head->next->m-1,1,0);
		continue;
	}
	push(Head,Head->next->m,Head->next->n-1,1);
}
}
int main(){
Ack(2,1);
VEC Head;
Build(Head);
Ack_(2,1,Head);
return 0;}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半份天才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值