如何基于加法定义每一阶的超运算?

dianyancao 2014-05-13 08:47:58
基于加法定义乘法
+,a,a == *,a,2

基于乘法定义幂
*,a,a == ^,a,2

基于幂定义超级幂
^,a,a == ↑,a,2

下面更高阶的运算要怎么定义呢?
如何用C++代码实现每一阶的运算?
...全文
246 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dianyancao 2014-05-16
  • 打赏
  • 举报
回复
如果直接递归分解成加法计算,时间复杂度是不是O(H(n,a,b)),空间复杂度是不是O(log(H(n,a,b)))?
dianyancao 2014-05-15
  • 打赏
  • 举报
回复
编译器生成如下汇编代码,如何优化这个汇编代码使用的堆栈大小?
int H(int n,int a,int b)
{
00F12910  push        ebp  
00F12911  mov         ebp,esp  
00F12913  sub         esp,0C0h  
00F12919  push        ebx  
00F1291A  push        esi  
00F1291B  push        edi  
00F1291C  lea         edi,[ebp-0C0h]  
00F12922  mov         ecx,30h  
00F12927  mov         eax,0CCCCCCCCh  
00F1292C  rep stos    dword ptr es:[edi]  
   if (n==0) return b+1;
00F1292E  cmp         dword ptr [n],0  
00F12932  jne         H+2Ch (0F1293Ch)  
00F12934  mov         eax,dword ptr [b]  
00F12937  add         eax,1  
00F1293A  jmp         H+87h (0F12997h)  
   if (n==1) return a+b;
00F1293C  cmp         dword ptr [n],1  
00F12940  jne         H+3Ah (0F1294Ah)  
00F12942  mov         eax,dword ptr [a]  
00F12945  add         eax,dword ptr [b]  
00F12948  jmp         H+87h (0F12997h)  
   if (n==2) return a*b;
00F1294A  cmp         dword ptr [n],2  
00F1294E  jne         H+49h (0F12959h)  
00F12950  mov         eax,dword ptr [a]  
00F12953  imul        eax,dword ptr [b]  
00F12957  jmp         H+87h (0F12997h)  
   if (n>=3&&b==0) return 1;
00F12959  cmp         dword ptr [n],3  
00F1295D  jl          H+5Ch (0F1296Ch)  
00F1295F  cmp         dword ptr [b],0  
00F12963  jne         H+5Ch (0F1296Ch)  
00F12965  mov         eax,1  
00F1296A  jmp         H+87h (0F12997h)  
   return H(n-1,a,H(n,a,b-1));
00F1296C  mov         eax,dword ptr [b]  
00F1296F  sub         eax,1  
00F12972  push        eax  
00F12973  mov         ecx,dword ptr [a]  
00F12976  push        ecx  
00F12977  mov         edx,dword ptr [n]  
00F1297A  push        edx  
00F1297B  call        H (0F1130Ch)  
00F12980  add         esp,0Ch  
   return H(n-1,a,H(n,a,b-1));
00F12983  push        eax  
00F12984  mov         eax,dword ptr [a]  
00F12987  push        eax  
00F12988  mov         ecx,dword ptr [n]  
00F1298B  sub         ecx,1  
00F1298E  push        ecx  
00F1298F  call        H (0F1130Ch)  
00F12994  add         esp,0Ch  
}
dianyancao 2014-05-14
  • 打赏
  • 举报
回复
用欧拉商数来计算模幂? https://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%AE%9A%E7%90%86_(%E6%95%B0%E8%AE%BA) 对x^x积分,积分变量为x,对e^(log(x)*x)展开的级数逐项积分,级数如何转化成超运算来计算,我弄不出来T_T
FancyMouse 2014-05-14
  • 打赏
  • 举报
回复
>嗯,模幂是算出循环节然后按循环节大小再取模吗? 有循环节最好。mod里质数幂次高的时候不是纯循环,还要更复杂一些,不过也就是复杂,难度不大。 >在超运算下,能不能用闭合表达式表示Integrate[x^x,x]? 你可以定义一个。这样就能充数了。
dianyancao 2014-05-14
  • 打赏
  • 举报
回复
嗯,模幂是算出循环节然后按循环节大小再取模吗? 在超运算下,能不能用闭合表达式表示Integrate[x^x,x]?
FancyMouse 2014-05-14
  • 打赏
  • 举报
回复
你先别管复杂度。递归层数一高,甚至指数套指数都无法表示那个大小。那算了还有啥用。 当然要是计算求模结果的话,那肯定有特殊技巧。
dianyancao 2014-05-13
  • 打赏
  • 举报
回复
高阶的超运算函数值增长的非常快,用int类型存储H(4,3,3)已经溢出,取2^32模后的结果为2030534587 计算H(n,a,b)的时间复杂度和空间复杂度如何估计? 计算代码简化为:
#include <iostream>

using namespace std;

int H(int n,int a,int b);

int main()
{
	cout<<H(4,3,3)<<endl;

	system("PAUSE");
	return 0;
}

int H(int n,int a,int b)
{
   if (n==0) return b+1;
   if (n==1) return a+b;
   if (n==2) return a*b;
   if (n>=3&&b==0) return 1;
   return H(n-1,a,H(n,a,b-1));
}
dianyancao 2014-05-13
  • 打赏
  • 举报
回复
怎么将下面的递归修改成用堆栈形式的非递归?
#include <iostream>

using namespace std;

int H(int n,int a,int b);

int main()
{
	cout<<H(3,4,6)<<endl;

	system("PAUSE");
	return 0;
}

int H(int n,int a,int b)
{
   if (n==0) return b+1;
   if (n==1&&b==0) return a;
   if (n==2&&b==0) return 0;
   if (n>=3&&b==0) return 1;
   return H(n-1,a,H(n,a,b-1));
}
dianyancao 2014-05-13
  • 打赏
  • 举报
回复
有没有非递归的写法?
ForestDB 2014-05-13
  • 打赏
  • 举报
回复
看了wiki,其中的G(n, a, b)是比较好的表示法。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧