30函数实现
2020-07-10 本文已影响0人
嬴小政今天好好吃饭了吗
计算理论导引作业2020/7/9交。
递归函数30个程序的实现。
#include<iostream>
#include<string>
#include<cstdio>
#include <vector>
using namespace std;
#define NUM 8
unsigned int aCantor[NUM][NUM];
//1
unsigned int add(unsigned int x, unsigned int y) {
unsigned int res;
res = x + y;
return res;
}
//2
unsigned int plusxy(unsigned int x, unsigned int y) {
unsigned int res;
res = x * y;
return res;
}
//3
unsigned int fac(int x)
{
unsigned int i, f = 1;
for (i = 1; i <= x; i++)
f *= i;
return f;
}
//4
unsigned int powxy(unsigned int x, unsigned int y) {
unsigned int res;
res = pow(x, y);
return res;
}
//5
unsigned int px(unsigned int x) {
unsigned int res;
if (x > 0)
res = x - 1;
else
res = 0;
return res;
}
//6
unsigned int sub(unsigned int x, unsigned int y) {
unsigned int res;
if (x >= y)
res = x - y;
else
res = 0;
return res;
}
//7
unsigned int absxy(unsigned int x, unsigned int y) {
unsigned int res;
res = sub(x, y) + sub(y, x);
return res;
}
//8
unsigned int alpha(unsigned int x) {
unsigned int res;
res = sub(1, x);
return res;
}
unsigned int f(unsigned int* X, unsigned int n, unsigned int t) {
unsigned int res = 0;
for (int i = 0; i < n; i++) {
res += X[i];
}
res = sub(res, t);
return res;
}
//9
unsigned int addf(unsigned int *X, unsigned int n, unsigned int Y) {
unsigned int res = 0;
for (int t = 0; t <= Y; t++) {
res += f(X,n, t);
}
return res;
}
//10
unsigned int plusf(unsigned int* X, unsigned int n, unsigned int Y) {
unsigned int res = 0;
for (int t = 0; t <= Y; t++) {
res *= f(X, n, t);
}
return res;
}
//11
unsigned int d(unsigned int x, unsigned int y) {
unsigned int res;
res = alpha(alpha(absxy(x, y)));
return res;
}
//12
unsigned int xequaly(unsigned int x, unsigned int y) {
unsigned int res;
if (x == y)
res = 0;
else
res = 1;
return res;
}
//`13
unsigned int xbiggery(unsigned int x, unsigned int y) {
unsigned int res;
res = alpha(sub(x,y));
return res;
}
//14
unsigned int xsmalequa(unsigned int x, unsigned int y) {
unsigned int res;
res = alpha(alpha(xequaly(x,y)) || (x < y));
return res;
}
//15
unsigned int ycanx(unsigned int x, unsigned int y) {
unsigned int res;
for (int i = 0; i <= x; i++) {
if (i * y == x) {
res = 0;
break;
}
else
res = 1;
}
return res;
}
//16
unsigned int ydivx(unsigned int x, unsigned int y) {
unsigned int res = 0;
for (int i = 0; i <= y; i++) {
if ((i +1) * x > y) {
res = i;
break;
}
}
return res;
}
//17
unsigned int prim(unsigned int x) {
unsigned int res = 0;
if (x <= 1)
res = 1;
else {
for (int t = 2; t <x; t++) {
res += alpha(ycanx(x, t));
}
res = alpha(alpha(res));
}
return res;
}
//18
unsigned int p(unsigned int x) {
unsigned int res = 0;
int i = -1,j = 1;//第0个素数是2
while (i != x ) {
j++;
if (prim(j) == 0) {
i++;
}
}
res = j;
return res;
}
//19
unsigned int R(unsigned int x, unsigned int y) {
unsigned int res;
res = (x%y);
return res;
}
//20
unsigned int t(unsigned int x) {
unsigned int res = 0,i = 0,count = 0;
while (x !=1) {//x一直对素数相除
if (x % p(i) == 0) {//如果可以被这个素数整除
while (x % p(i) == 0) {//就一直整除下去
x = x / p(i);
}
}
else {
count++;//零指个数加一
}
i++;
}
res = i - count;
return res;
}
//21
unsigned int xi(unsigned int x, unsigned int i) {
unsigned int res = 0, j = 0, count = 0;
if (i >= 0) {
while (x != 1) {//x一直对素数相除
if (x % p(j) == 0) {//如果可以被这个素数整除
while (x % p(j) == 0) {//就一直整除下去
x = x / p(j);
if (j == i)
count++;
}
}
j++;
}
res = count;
}
else
res = 0;
return res;
}
//22
unsigned int Lt(unsigned int x) {
unsigned int res = 0, i = 0, count = 0;
while (x != 1) {//x一直对素数相除
if (x % p(i) == 0) {//如果可以被这个素数整除
while (x % p(i) == 0) {//就一直整除下去
x = x / p(i);
}
res = i + 1;
}
i++;
}
return res;
}
//23
bool GN(unsigned int x) {
bool res = true;
unsigned int i = 0;
while (x != 1) {//x一直对素数相除
if (x % p(i) == 0) {//如果可以被这个素数整除
while (x % p(i) == 0) {//就一直整除下去
x = x / p(i);
}
}
else
res = false;
i++;
}
return alpha(res);
}
//24
vector<unsigned int> an(unsigned int x) {
vector<unsigned int> res;
unsigned int i = 0;
while (x != 1) {//x一直对素数相除
unsigned int count = 0;
if (x % p(i) == 0) {//如果可以被这个素数整除
while (x % p(i) == 0) {//就一直整除下去
x = x / p(i);
count++;
}
}
res.push_back(count);
i++;
}
return res;
}
//25
vector<unsigned int> XGodelY(vector<unsigned int> X, vector<unsigned int> Y) {
vector<unsigned int> res;
vector <unsigned int>::iterator tmp;
for (tmp = Y.begin(); tmp != Y.end(); tmp++) {
X.push_back(*tmp);
}
//a.insert(a.end(), b, begin(), b.end());其实用insert更好
return res = X;
}
//26
unsigned int sharpax(unsigned int x, unsigned int a) {
unsigned int res = 0;
vector<unsigned int> anRes = an(x);
vector <unsigned int>::iterator tmp;
for (tmp = anRes.begin(); tmp != anRes.end(); tmp++) {
if (*tmp == a)
res++;
}
return res;
}
//27
unsigned int match(unsigned int x, unsigned int y) {
unsigned int res = 0;
return res = aCantor[x][y];
}
//28
unsigned int r(unsigned int z) {
unsigned int res = 0;
for (int i = 0; i < NUM; i++) {
for (int j = 0; j < NUM - i; j++) {
if (match(i, j) == z)
res = j;
}
}
return res;
}
//29
unsigned int l(unsigned int z) {
unsigned int res = 0;
for (int i = 0; i < NUM; i++) {
for (int j = 0; j < NUM - i; j++) {
if (match(i, j) == z)
res =i;
}
}
return res;
}
//30
unsigned int PROG(unsigned int x) {
unsigned int res = 0;//默认谓词为真
vector<unsigned int> rn= an(x);
vector<unsigned int> in;
vector<unsigned int> jn;
vector <unsigned int>::iterator tmp0;
vector <unsigned int>::iterator tmp1;
for (tmp0 = rn.begin(); tmp0 != rn.end(); tmp0++) {
for (int i = 0; i < NUM; i++) {
for (int j = 0; j < NUM - i; j++) {
if (aCantor[i][j] == *tmp0) {
if (j == 0)//如果出现j为0就一定不成立
{
return 1;
}
else {//没有的话就继续执行
in.push_back(i);
jn.push_back(j);
}
}
}
}
}
//已经得到了“二维”数组
for (tmp0 = in.begin(); tmp0 == in.end(); tmp0++) {
for (tmp1 = jn.begin(); tmp1 == jn.end(); tmp1++) {
//如果两者都不为0
if (in[*tmp0] != 0 && in[*tmp1] != 0) {
if (in[*tmp0] == in[*tmp1]) {//两者相等
return 1;
}
}
}
}
return res;
}
int main()
{
//初始数据(默认数据)
unsigned int x = 128, y = 3, i = 1, n = 7, Y = 7, z = 18;
unsigned int X[7] = { 1,1,1,1,1,1,1 };
int xTmp = 1;//27
int a = 2;//26
vector <unsigned int> anRes;//24
vector <unsigned int>::iterator tmp;
vector <unsigned int> xn, yn;//25
vector <unsigned int> XGodelYRes = XGodelY(xn, yn);//25
//cantor矩阵
int count = 0, count1 = 0;
int iac = 0, jac = 0;
for (count = 0; count < NUM; count++) {
for (jac = 0; jac <= count; jac++) {
iac = count - jac;
aCantor[iac][jac] = count1++;
//验证cantor矩阵的正确性
//cout << iac << " " << jac << endl;
//cout << aCantor[iac][jac] << endl;;
}
}
int choice1;
cout << "选择1、自行输入数据测试;2、直接看结果" << endl;
cin >> choice1;
int choice2;
int stopPro = 1;
if (choice1 == 1) {
while (stopPro == 1) {
cout << "请选择你要测试的程序(1-30)【如果要退出测试请按0】" << endl;
cin >> choice2;
switch (choice2) {
case 1:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "1. x + y = " << add(x, y) << endl;
break;
case 2:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "2. x * y = " << plusxy(x, y) << endl;
break;
case 3:
cout << "请输入x" << endl;
cin >> x;
cout << "3. x! = " << fac(x) << endl;
break;
case 4:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "4. pow(x,y) = " << powxy(x, y) << endl;
break;
case 5:
cout << "请输入x" << endl;
cin >> x;
cout << "5. p(x) = " << px(x) << endl;
break;
case 6:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "6. sub(x,y) = " << sub(x, y) << endl;
break;
case 7:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "7. abs(x,y) = " << absxy(x, y) << endl;
break;
case 8:
cout << "请输入x" << endl;
cin >> x;
cout << "8. alpha(x) = " << alpha(x) << endl;
break;
case 9:
cout << "本次测试中X[7] = { 1,1,1,1,1,1,1 }, Y = 7" << endl;
cout << "9. addf(x1,x2...xn,t(0-Y)) = " << addf(X, n, Y) << endl;
break;
case 10:
cout << "本次测试中X[7] = { 1,1,1,1,1,1,1 }, Y = 7" << endl;
cout << "10. plusf(x1,x2...xn,t(0-Y)) = " << plusf(X, n, Y) << endl;
break;
case 11:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "11. d(x,y) = " << d(x, y) << endl;
break;
case 12:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "12. x = y = " << xequaly(x, y) << endl;
break;
case 13:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "13. x > y = " << xbiggery(x, y) << endl;
break;
case 14:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "14. x <= y = " << xsmalequa(x, y) << endl;
break;
case 15:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "15. y | x = " << ycanx(x, y) << endl;
break;
case 16:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "16. y / x = " << ydivx(x, y) << endl;
break;
case 17:
cout << "请输入x" << endl;
cin >> x;
cout << "17. prim(x) =" << prim(x) << endl;
break;
case 18:
cout << "请输入x" << endl;
cin >> x;
cout << "18. p(x) = " << p(x) << endl;
break;
case 19:
cout << "请输入x, y" << endl;
cin >> x >> y;
cout << "19. R(x,y) = " << R(x, y) << endl;
break;
case 20:
cout << "请输入x" << endl;
cin >> x;
cout << "20. t(x) = " << t(x) << endl;
break;
case 21:
cout << "请输入x,i" << endl;
cin >> x >> i;
cout << "21. x(i) = " << xi(x, i - 1) << endl;
break;
case 22:
cout << "请输入x" << endl;
cin >> x;
cout << "22. Lt(x) = " << Lt(x) << endl;
break;
case 23:
cout << "请输入x" << endl;
cin >> x;
cout << "23. GN(x) = " << GN(x) << endl;
break;
case 24:
cout << "请输入x" << endl;
cin >> x;
cout << "24.an(x) = ";
anRes = an(x);
for (tmp = anRes.begin(); tmp != anRes.end(); tmp++) {
cout << *tmp << " ";
}
cout << endl;
break;
case 25:
cout << "规定X = {0,1,2,3,4},Y = {5,6,7,8,9}" << endl;
for (int i = 0; i < 5; i++) {
xn.push_back(i);
yn.push_back(i + 5);
}
cout << "25. XGodelY = ";
XGodelYRes = XGodelY(xn, yn);
for (tmp = XGodelYRes.begin(); tmp != XGodelYRes.end(); tmp++) {
cout << *tmp << " ";
}
cout << endl;
break;
case 26:
cout << "请输入a,X" << endl;
cin >> a >> x;
cout << "26. #(a,X) = " << sharpax(x, a) << endl;
break;
case 27:
cout << "请输入x,y(由于cantor矩阵在本程序中的限制,注意x和y的和不能超过NUM = 7)" << endl;
cin >> x >> y;
cout << "27. <X,Y>= " << match(x, y) << endl;
break;
case 28:
cout << "输入Z" << endl;
cin >> z;
cout << "28. r(Z)= " << r(z) << endl;
break;
case 29:
cout << "输入Z" << endl;
cin >> z;
cout << "29. l(Z)= " << l(z) << endl;
break;
case 30:
cout << "输入x" << endl;
cin >> x;
cout << "30. PROG(X)= " << PROG(x) << endl;
break;
default:
stopPro = 0;
break;
}
cout << endl;
}
}
else {
cout << "初始化的数据:" << endl;
cout << "x = " << x << endl << "y = " << y << endl << "n = " << n << endl << "z = " << z << endl;
cout << "Y = " << Y << endl;;
cout << "X : ";
for (int k = 0; k < Y; k++)
cout << " " << X[k];
cout << endl;
cout << "1. x + y = " << add(x, y) << endl;
cout << "2. x * y = " << plusxy(x, y) << endl;
cout << "3. x! = " << fac(x) << endl;
cout << "4. pow(x,y) = " << powxy(x, y) << endl;
cout << "5. p(x) = " << px(x) << endl;
cout << "6. sub(x,y) = " << sub(x, y) << endl;
cout << "7. abs(x,y) = " << absxy(x, y) << endl;
cout << "8. alpha(x) = " << alpha(x) << endl;
cout << "9. addf(x1,x2...xn,t(0-Y)) = " << addf(X, n, Y) << endl;
cout << "10. plusf(x1,x2...xn,t(0-Y)) = " << plusf(X, n, Y) << endl;
cout << "11. d(x,y) = " << d(x, y) << endl;
cout << "12. x = y = " << xequaly(x, y) << endl;
cout << "13. x > y = " << xbiggery(x, y) << endl;
cout << "14. x <= y = " << xsmalequa(x, y) << endl;
cout << "15. y | x = " << ycanx(x, y) << endl;
cout << "16. y / x = " << ydivx(x, y) << endl;
cout << "17. prim(x) =" << prim(x) << endl;
cout << "18. p(x) = " << p(x) << endl;
cout << "19. R(x,y) = " << R(x, y) << endl;
cout << "20. t(x) = " << t(x) << endl;
cout << "21. x(i) = " << xi(x, i - 1) << endl;
cout << "22. Lt(x) = " << Lt(x) << endl;
cout << "23. GN(x) = " << GN(x) << endl;
cout << "24.an(x) = ";
anRes = an(x);
for (tmp = anRes.begin(); tmp != anRes.end(); tmp++) {
cout << *tmp << " ";
}
cout << endl;
for (int i = 0; i < 5; i++) {
xn.push_back(i);
yn.push_back(i + 5);
}
cout << "25. XGodelY = ";
XGodelYRes = XGodelY(xn, yn);
for (tmp = XGodelYRes.begin(); tmp != XGodelYRes.end(); tmp++) {
cout << *tmp << " ";
}
cout << endl;
cout << "26. #(a,X) = " << sharpax(x, a) << endl;
cout << "27. <X,Y>= " << match(xTmp, y) << endl;//注意xTmp和y的和不能超过NUM
cout << "28. r(Z)= " << r(z) << endl;
cout << "29. l(Z)= " << l(z) << endl;
cout << "30. PROG(X)= " << PROG(x) << endl;
}
getchar();
return 0;
}