数据结构题集-第三章-栈和队列-Ackerman函数

server/2024/12/16 7:33:51/

Ackerman函数

说明

  • 本文参照严蔚敏《数据结构(C语言版)题集》一书中包含的问答题和算法设计题目,提供解答和算法的解决方案。
  • 请读者在自己已经解决了某个题目或进行了充分的思考之后,再参考本解答,以保证复习效果。
  • 由于作者水平所限,本解答中一定存在不少这样或者那样的错误和不足,希望读者们在阅读中多动脑、勤思考,争取发现和纠正这些错误,写出更好的算法来。

3.27 已知Ackerman函数的定义如下

a k m ( m , n ) = { a k m ( m − 1 , a k m ( m , n − 1 ) ) m ≠ 0 , n ≠ 0 a k m ( m − 1 , 1 ) m ≠ 0 , n = 0 n + 1 m = 0 akm(m,n)=\begin{cases} akm(m-1,akm(m,n-1))\quad &m\neq{0},n\neq{0}\\ akm(m-1,1) &m\neq{0},n=0\\ n+1 &m=0 \end{cases} akm(m,n)= akm(m1,akm(m,n1))akm(m1,1)n+1m=0,n=0m=0,n=0m=0
(1)写出递归算法
(2)写出非递归算法
(3)根据非递归算法,画出求 a k m ( 2 , 1 ) akm(2,1) akm(2,1)时栈的变化过程。

解:

(1)递归算法如下

int akm(int m,int n){int a,g;if(m==0) a=n+1;else if(n==0) a=akm(m-1,1);else{g=akm(m,n-1);a=akm(m-1,g);}return a;
}

(2)非递归算法如下

#include<stdio.h>
#define STACK_SIZE 50000
typedef struct{int mval;int nval;
} ElemType;typedef struct{int top;
} Stack;ElemType space[STACK_SIZE];void init_stack(Stack *ps){ps->top=0;
}int stack_empty(Stack s){return !s.top;
}void push(Stack *ps,ElemType e){if(ps->top>=STACK_SIZE) return;space[ps->top++]=e;
}void pop(Stack *ps,ElemType *pe){if(ps->top<=0) return;*pe=space[--ps->top];
}int get_top(Stack s,ElemType *pe){if(s.top<=0) return 0;else{*pe=space[s.top-1];return 1;}
}int akm(int m,int n){int a,g;if(m==0) a=n+1;else if(n==0) a=akm(m-1,1);else{g=akm(m,n-1);a=akm(m-1,g);}return a;
}void print_space(Stack s){int i;for(i=0;i<STACK_SIZE;i++){if(i==s.top)printf("[");printf("{%d,%d}",space[i].mval,space[i].nval);if(i==s.top)printf("]");}printf("\n");
}int akm_nonr(int m,int n){Stack s;ElemType e,et;init_stack(&s);e.mval=m;e.nval=n;push(&s,e);do{if(!get_top(s,&e)) break;while(e.mval){if(!get_top(s,&e)) break;while(e.nval){e.nval--;push(&s,e);}pop(&s,&e);e.mval--;e.nval=1;push(&s,e);}if(s.top>1){pop(&s,&e);et.nval=e.nval;pop(&s,&e);e.mval--;e.nval=et.nval+1;push(&s,e);}if(!get_top(s,&et)) break;}while(s.top>1||et.mval>0);pop(&s,&et);//print_space(s);return et.nval+1;
}int main(){int m,n;m=2,n=1;do{printf("%d\n",akm(m,n));printf("%d\n",akm_nonr(m,n));scanf("%d %d",&m,&n);}while(m>0&&n>0);return 0;
}

这里的非递归算法并没有按照书后的答案走捷径,
严格使用栈的操作,
每当需要改变栈顶元素的值,
都是先出栈,改了以后就入栈。

(3) a k m ( 2 , 1 ) akm(2,1) akm(2,1)时栈的变化过程如下

对栈中元素的操作栈的内容[方括号中间是栈顶元素]
push({2,1})[{2,1}]
push({2,0}){2,1}[{2,0}]
change top value{2,1}[{1,1}]
push({1,0}){2,1}{1,1}[{1,0}]
change top value{2,1}{1,1}[{0,1}]
pop() to e={0,1}{2,1}[{1,1}]
change top value{2,1}[{0,2}]
pop() to e={0,2}[{2,1}]
change top value[{1,3}]
push({1,2}){1,3}[{1,2}]
push({1,1}){1,3}{1,2}[{1,1}]
push({1,0}){1,3}{1,2}{1,1}[{1,0}]
change top value{1,3}{1,2}{1,1}[{0,1}]
pop() to e={0,1}{1,3}{1,2}[{1,1}]
change top value{1,3}{1,2}[{0,2}]
pop() to e={0,2}{1,3}[{1,2}]
change top value{1,3}[{0,3}]
pop() to e={0,3}[{1,3}]
change top value[{0,4}]
pop() to e={0,4}result=4+1=5

注意此题中m和n的选择,
在可以忍受的时间范围内算到m=3和n=10就很不错了,
继续算,对时间和空间的需求是很高的,
算到m=4和n=1时,50000个栈空间可能就不够了,
所以需要更大的内存和处理速度才能得到结果,
虽然此题的运算过程有明显的规律,
但目前还没有找到快速得到结果的公式。


http://www.ppmy.cn/server/150562.html

相关文章

@Repository

Repository 是 Spring 框架中用来标识数据访问对象&#xff08;DAO&#xff09;层的注解。以下是关于 Repository 注解的一些关键点&#xff1a; Bean 注册&#xff1a;Repository 注解会自动将使用该注解的类注册为 Spring 容器中的 Bean&#xff0c;无需在 XML 配置文件中显式…

UE4_贴花_贴花基础知识一

贴花可以将材料和各种材料元素投影到表面上。您可以使用它们来添加独特的效果。贴花 是一种可以投射到网格体&#xff08;包括静态网格体和骨骼网格体&#xff09;上的材质。无论这些网格体的移动性&#xff08;Mobility&#xff09;是静态&#xff08;Static&#xff09;还是可…

oracle网络架构

Oracle 网络配置文件 Oracle 的网络配置主要涉及三个关键的文件&#xff1a;listener.ora、tnsnames.ora 和 sqlnet.ora。这些文件通常位于 $ORACLE_HOME/network/admin/ 目录下&#xff0c;$ORACLE_HOME 是 Oracle 安装目录的环境变量&#xff0c;通常为 /u01/app/oracle/pro…

MIF格式详解,javascript加载导出 MIF文件示例

MIF 格式详解 MIF&#xff08;MapInfo Interchange Format&#xff09;是由Pitney Bowes Software开发的一种文本格式&#xff0c;用于存储地理空间数据。它通常与地图可视化和地理信息系统&#xff08;GIS&#xff09;相关联。MIF文件通常成对出现&#xff0c;一个.mif文件用…

基于SpringBoot的疫苗在线预约功能实现十

一、前言介绍&#xff1a; 1.1 项目摘要 随着全球公共卫生事件的频发&#xff0c;如新冠疫情的爆发&#xff0c;疫苗成为了预防和控制传染病的重要手段。传统的疫苗预约方式&#xff0c;如人工挂号或电话预约&#xff0c;存在效率低、易出错、手续繁琐等问题&#xff0c;无法…

自动驾驶域控制器简介

汽车智能驾驶功能持续高速渗透&#xff0c;带来智能驾驶域控制器市场空间快速增 长。智驾域控制器是智能驾驶决策环节的重要零部件&#xff0c;主要功能为处理感知 信息、进行规划决策等。其核心部件主要为计算芯片&#xff0c;英伟达、地平线等芯 片厂商市场地位突出。随着消费…

saltstack 和 ansible 最新比对

Ansible 和 SaltStack、Puppet 等都是配置管理系统&#xff08;configuration management system&#xff09; Ansible 和 SaltStack 都是 Python 编译的自动化运维工具&#xff0c;都是使用模块管理。不同的是Ansible没有客户端&#xff08;使用的 SSH 通道传输&#xff09;而…

报错:Method Not Allowed

当报错这个的时候就要注意了&#xff0c;自己的方法是否写对了&#xff01;&#xff01;&#xff01; 就像我的这个因为我的后端是put&#xff0c;所以这也是put&#xff0c;我报错就是因为这写了get&#xff0c;虽然页面是改变了&#xff0c;但是一刷新&#xff0c;就会原形毕…