Ackermann函式的遞迴與非遞迴演算法

2021-09-25 11:49:05 字數 1939 閱讀 3411

//折騰了我將近一周了,沒查到能實際應用的程式**只好自己魔改

#ifndef pch_h

#define pch_h

/*科普:阿克曼函式

ackermann(0,n)=n+1

ackermann(1,n)=n+2

ackermann(2,n)=2*n+3

ackermann(3,n)=2^(n+3)-3

*/#include

#include

#include

#include

#include

constexpr auto maxsize =

100;

constexpr auto error =0;

constexpr auto ok =1;

constexpr auto m=2;

constexpr auto n=3;

typedef

int status;

typedef

struct

elemtype;

typedef

struct

sqstack;

status initstack

(sqstack &s)

;int

ackermann_re

(int m,

int n)

;//遞迴演算法

intackermann

(int m,

int n)

;//非遞迴演算法

#endif

//pch_h

----

----

----

----

----

----

----

----

----

----

----

----

----

----

-------

#include

"pch.h"

// 一般情況下,忽略此檔案,但如果你使用的是預編譯標頭,請保留它。

/*個人計算了三個值尋規律

在不同的m值下關於n的不同函式

m=0,ack(0,n)=n+1

m=1,ack(1,n)=2+n

m=2,ack(2,n)=3+2n

m=3,ack(3,n)---->ack(3,0)=ack(2,1)=2x1+3=5,同上陸續迭代

*/status initstack

(sqstack & s)

intackermann_re

(int m,

int n)

else

if(n==0)

else

}int

ackermann

(int m,

int n)

s.top->m--

;//最高層確實是ack(m,0)=ack(m-1,1)

s.top->n=1;

}if(s.top > s.base)

//非棧底,同時這時棧底m也不可能為0的

}while

(s.top!= s.base || s.top->m!=0)

;int ack = s.top->n +1;

return ack;}--

----

----

----

----

----

----

----

----

----

----

----

----

----

----

----

--//

#include

"pch.h"

#include

intmain()

強大的ackermann函式

演算法老師給我們布置的兩道題拖了幾天了,今天決定搞定它們。其中有一道就是 計算ackermann函式ack m,n 的遞迴計算函式。對於m 0,n 0,ack m,n 定義為 ack 0,n n 1 ack m,0 ack m 1,1 ack m,n ack m 1,ack m,n 1 對著題目看了...

Ackermann函式的個人理解

最近又從頭看起 sicp 其中一道練習 1.10 裡提到了ackermann函式,但定義似乎有些不同。lang scheme define a x y cond y 0 0 x 0 2 y y 1 2 else a x 1 a x y 1 lisp括號真的多 簡單來說就是乙個函式a x,y y 0時...

遞迴演算法與遞迴函式

遞迴演算法就是通過將問題不斷分解為同類子問題而解決問題的方法。絕大多數程式語言是支援函式的自呼叫的,也就是支援函式自身來進行遞迴。根據計算理論,可以證明出遞迴可以完全取代迴圈,因此在很多函式程式設計中習慣使用遞迴來實現迴圈。但是遞迴有乙個問題就是需要不斷的呼叫函式,會有較大的開銷。遞迴的函式需要逐級...