Ackerman函数(阿克曼函数) 递归实现(C++)
文章目录一、什么是Ackerman函数(阿克曼函数)二、递归算法实现1. 设计递归方程2. 确定边界条件3. 编写程序代码4. 运行结果展示一、什么是Ackerman函数(阿克曼函数)定义:A(m,n)={n+1若m=0A(m−1,1)若m>0且n=0A(m−1,A(m,n−1))若m>0且n>0A(m,n)=\begin{cases}n+1 & 若m=0\\A(m-1,
一、什么是Ackerman函数(阿克曼函数)
定义:
A ( m , n ) = { n + 1 若 m = 0 A ( m − 1 , 1 ) 若 m > 0 且 n = 0 A ( m − 1 , A ( m , n − 1 ) ) 若 m > 0 且 n > 0 A(m,n)=\begin{cases} n+1 & 若m=0\\ A(m-1,1) & 若m>0且n=0 \\ A(m-1,A(m,n-1)) & 若m>0且n>0 \end{cases} A(m,n)=⎩⎪⎨⎪⎧n+1A(m−1,1)A(m−1,A(m,n−1))若m=0若m>0且n=0若m>0且n>0
或:
{ A ( 1 , 0 ) = 2 m = 0 , n = 1 A ( 2 , m ) = 1 m ≥ 0 , n = 0 A ( n , 0 ) = n + 2 m = 0 , n ≥ 2 A ( n , m ) = A ( A ( n − 1 , m ) , m − 1 ) m ≥ 1 , n ≥ 1 \begin{cases} A(1,0)=2 & m=0,n=1\\ A(2,m)=1 & m≥0,n=0 \\ A(n,0)=n+2 & m=0,n≥2\\ A(n,m)=A(A(n-1,m),m-1) & m≥1,n≥1 \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧A(1,0)=2A(2,m)=1A(n,0)=n+2A(n,m)=A(A(n−1,m),m−1)m=0,n=1m≥0,n=0m=0,n≥2m≥1,n≥1
二、递归算法实现
1. 设计递归方程
当存在两个自变量时,应当先确定一个,然后再去研究关于另一个自变量的函数变化。
- 当
m
=
0
m=0
m=0时
- A ( m , n ) = n + 1 A(m,n)=n+1 A(m,n)=n+1
- 当
m
>
0
m>0
m>0时
- 若 n = 0 n=0 n=0,则 A ( m , n ) = A ( m − 1 , 1 ) A(m,n)=A(m−1,1) A(m,n)=A(m−1,1)
- 若 n > 0 n>0 n>0,则 A ( m , n ) = A ( m − 1 , A ( m , n − 1 ) ) A(m,n)=A(m−1,A(m,n−1)) A(m,n)=A(m−1,A(m,n−1))
2. 确定边界条件
此例为双重递归;其自变量为 m , n m,n m,n,当 m < 0 且 n < 0 m<0且n<0 m<0且n<0时跳出函数
3. 编写程序代码
// Ackermann函数(阿克曼函数)的递归实现算法
#include <iostream>
using namespace std;
int ackermann(int m, int n);
int main()
{
int m, n = 0;
cout << "请输入第一个数m(自然数):";
cin >> m;
cout << "请输入第二个数n(自然数):";
cin >> n;
cout << "A(m, n) = " << ackermann(m, n) << endl;
return 0;
}
int ackermann(int m, int n)
{
if (m == 0)
return n + 1;
else if (m > 0 && n == 0)
return ackermann(m - 1, 1);
else // else if (m > 0 && n > 0)
return ackermann(m - 1, ackermann(m, n - 1));
}
4. 运行结果展示
*其它一些常见算法请参阅此链接~
最后,非常欢迎大家来讨论指正哦!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)