递归算法的非递归实现例子

【问题描述】已知Ackerman函数定义如下:

ack(m,n)=\left\{\begin{matrix} n+1, m=0 & \\ akm(m-1,1),m\neq 0,n=0& \\akm(m-1,akm(m,n-1)),m\neq 0,n\neq 0 & \end{matrix}\right.

 (1)根据定义,写出它的递归求解算法;

(2)利用栈,写出它的非递归求解算法。

【解答】

(1)递归实现

int Ackerman(int m,int n)
{
    if(m==0) return n+1;
    if(n==0) return Ackerman(m-1,1);
    return Ackerman(m-1,Ackerman(m,n-1));
}

(2)非递归实现:

设m=2,n=1,分析算法的递归过程如下图:

 可利用栈记忆各层结点的m,n值。每个结点2个域,分别记录m,n。如下所示:

 

代码如下:

int Ackerman(int m, int n) {
	int i, j, k, top = -1; 
	int Sm[100], Sn[100];
	Sm[++top] = m; Sn[top] = n;   //Sm,Sn是栈,top是栈顶指针
	while (1) {
		i = Sm[top]; j = Sn[top]; top--;   //出栈
		if (i == 0) {                      //m=0
			k = j + 1;
			if (top != -1) Sn[top] = k;
			else return k;
		}
		else if (j == 0) {                 //m!=0,n=0
			Sm[++top] = i - 1;
			Sn[top] = 1;
		}
		else {                             //m!=0,n!=0
			Sm[++top] = i - 1;
			Sm[++top] = i;
			Sn[top] = j - 1;
		}
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值