C++第七次作业(函数_递归与非递归_多文件)
文章目录:
一:C++递归与非递归实现整数的阶乘
代码实现
运行结果
二:C++递归与非递归实现Fibonacci数列的计算:a0=1; a1=1; a2=a0+a1; a3=a1+a2; ....... ;a20=a18+a19
代码实现
运行结果
三:C++递归与非递归实现数学函数f(x,n)=sqrt{n+sqrt(n-1)+sqrt(n-2)+....sqrt(1+x)}
代码实现
运行结果
四:C++递归与非递归实现汉诺依塔(Hanoi塔)
代码实现
运行结果
五::C++递归与非递归实现设计求两个自然数的最大公约数
代码实现
运行结果
六:C/C++多文件分文件编写程序编程实现小学生四则运算测试题并根据答题情况给出成绩
C++函数分文件代码实现步骤
第一步:创建项目
第二步:创建一个XXX.h的头文件
第三步:创建一个XXX.cpp的源文件
第四步:在源文件(XXX.cpp)中写函数的定义
第五步:在头文件(XXX.h)中写函数的声明,调用函数
运行结果
非递归就是我们正常得思路规律写代码即可,用循环等之后封装一下
递归就返回一个值,不用循环,通过递归规律,通常需要自己去总结规律,和非递归思路一样,但是通常公式不一样之后封装一下
一:C++递归与非递归实现整数的阶乘
- 设计非递归函数double Facta(unsigned short n),计算n!
- 设计递归函数double Factb(unsigned short n),计算n!
- 主函数main()分别调用以上两函数,求解某无符号整数的阶乘。
代码实现
#include <iostream>
using namespace std;//C++递归与非递归实现整数的阶乘//声明
double Factb(short n);//递归
double Facta(int n);//非递归//递归
double Factb(short n) {if (n == 0 || n == 1) return 1;return n * Factb(n-1);
}//非递归
double Facta(short n) {int result;result = 1;for (int i=1;i<=n;i++){result = i * result;}return result;
}int main()
{short n;cout << "请输入阶层n=";cin >> n;cout << "开始 递归:"<<"n!=" << Factb(n) << endl;cout << "开始非递归:"<< "n!=" << Facta(n) << endl;system("pause");return 0;
}
运行结果
二:C++递归与非递归实现Fibonacci数列的计算:a0=1; a1=1; a2=a0+a1; a3=a1+a2; ....... ;a20=a18+a19
- 设计非递归函数void Fibonaccia(unsigned short n),输出a0到a20;
- 设计递归函数unsigned Fibonaccib(unsigned short n);
- 主函数main()分别调用以上两函数
void main()
{ int i;
Fibonaccia(20);
for(i=0;i<=20;i++)cout<<Fibonaccib(i);
}
代码实现
#include <iostream>
using namespace std;//C++递归与非递归实现Fibonacci数列的计算:a0=1; a1=1; a2=a0+a1; a3=a1+a2; ....... ;a20=a18+a19//声明
int Fibonaccib(short n);//递归
int Fibonaccia(short n);//非递归//递归
int Fibonaccib(short n)
{if(n<0)cout<<"抱歉你输入的数有误"<<endl;else if(n==0 || n==1)return 1;else {return Fibonaccib(n - 1) + Fibonaccib(n - 2);}
}//非递归
int Fibonaccia(short n) {int a = 1; //第i-2项int b = 1; //第i-1项int result;//求的项if (n <= 1) return 1;else{for (int i = 1; i < n; i++)//每次循环都要更新前1项与前2项的值{result = a + b;a = b;b = result;}return result;}
}void main()
{int i;cout<<"现在开始递归:------------------------------"<<endl;for(i=0;i<=20;i++){cout << "递归 结果:" << Fibonaccib(i) << endl;}cout<<"现在开始非递归:---------------------------"<<endl;for(i=0;i<=20;i++){cout << "非递归结果:" << Fibonaccia(i) << endl;}system("pause");//return 0;
}
运行结果
三:C++递归与非递归实现数学函数f(x,n)=sqrt{n+sqrt(n-1)+sqrt(n-2)+....sqrt(1+x)}
- 设计非递归函数double funa(double x,unsigned n);
- 设计递归函数double funb(double x,unsigned n);
- 主函数main()分别调用以上函数计算。
代码实现
#include <iostream>
#include <cmath>
using namespace std;//C++递归与非递归实现数学函数f(x,n)=sqrt{n+sqrt(n-1)+sqrt(n-2)+....sqrt(1+x)}//声明
double funa(double x,unsigned n);//递归
double funb(double x,unsigned n);//非递归//递归
double funa(double x,unsigned n)
{double result;if (n==1){result=sqrt(x+1);}else{result=sqrt(n+funa(x,n-1));}return result;
}//非递归
double funb(double x,unsigned n)
{double result;double i;result=sqrt(1+x);for (i = 0; i <=n; i++){result=sqrt(i+result);}return result;
}int main()
{double x;unsigned n;cout<<"请输入未知量x:"<<endl;cin >>x;cout<<"请输入 n的值:"<<endl;cin >>n;cout<<"递 归求得函数得解为:"<<funa(x,n)<<endl;cout<<"非递归求得函数得解为:"<<funb(x,n)<<endl;system("pause");return 0;
}
运行结果
四:C++递归与非递归实现汉诺依塔(Hanoi塔)
- 编写递归函数void Hanoita(char A , char B , char C , unsigned short n),实现将n个铁块从A柱借助于B柱移动到C柱;
递归算法:
如果n==1,直接从A柱搬到C柱
否则: (1)先将上面的n-1块从A柱借助C柱搬到B柱,即Hanoita(A,C,B,n-1);
(2)A柱上仅剩1块,直接从A柱搬到C柱;
(3)再将B柱上的n-1块借助A柱搬到C柱,即Hanoita(B,A,C,n-1)。
- 主函数main()调用以上函数。
- 要求按以下格式输出搬运过程
Step 1: A ==> C
Step 2: A ==> B
Step 3: C ==> B
……………………
非递归思想
汉诺塔有三个支架
铁饼对方的顺序必须满足小的在上面,大的在下面
当铁饼的个数为n时,移动的次数应等于2^n - 1
最大盘n 号盘在整个移动过程中只移动一次,n-1 号移动2 次,i 号盘移动2^(n-i)次.
最大盘n 号盘只移动一次:A-->C它是逆时针移动.
n-1 移动2 次:A-->B,B-->C,是顺时针移动
成一定的周期T=3,
当铁饼n为偶数,按顺时针方向依次摆放 A B C【A-->B,B-->C,C-->A】
当铁饼n为奇数,按逆时针方向依次摆放 A C B【A-->C,C-->B,B-->A】
1 号盘移动次数最多,每2 次移动一次.
第2k+1 次移动的是1 号盘,且是第k+1 次移动1 号盘.
第4k+2 次移动的是2 号盘,且是第k+1 次移动2 号盘.
第(2^s)k+2^(s-1)次移动的是s 号盘,这时s 号盘已被移动了k+1 次.
每2^s 次就有一次是移动s 号盘.
第一次移动s 号盘是在第2^(s-1)次.
第二次移动s 号盘是在第2^s+2^(s-1)次.
第k+1 次移动s 号盘是在第k*2^s+2^(s-1)次.
代码实现:枚举 1, 2, 3, 4·····i, i+1, i+2, ·····步。
先 获取 第i步移动的几号盘,根据 (2^s)k+2^(s-1)=i,转化一下,满足 i%(2^s) =2^(s-1) ,令t=2^s;则有i%t=t/2
再 获得第S盘 第几次移动 ,根据 (2^s)k+2^(s-1)=i, k=i/(2^s) ,即 k=i/t;
最后 根据周期T 与奇偶性 确定具体移动的步骤(共6六种)
递归思想
如果n==1,直接从A柱搬到C柱否则: (1)先将上面的n-1块从A柱借助C柱搬到B柱,即Hanoita(A,C,B,n-1);
(2)A柱上仅剩1块,直接从A柱搬到C柱;
(3)再将B柱上的n-1块借助A柱搬到C柱,即Hanoita(B,A,C,n-1)
参考:
汉诺塔算法c++源代码(递归与非递归)[转] - AI Algorithms - 博客园
汉诺塔问题(递归与非递归详解)--------------Five—菜鸟级_Five—菜鸟级的博客-CSDN博客_非递归汉诺塔
汉诺塔的递归与非递归实现_a_sleepy_child的博客-CSDN博客_汉诺塔的递归与非递归
汉诺塔递归与非递归算法_llanlianggui的博客-CSDN博客_汉诺塔非递归算法
代码实现
#include <iostream>
#include<stdlib.h>
#include<stdio.h>
#include<cmath>
using namespace std;
const int MAX = 64;//圆盘的个数最多为64 //声明
void Hannoi(int n,char a,char b,char c) ;//递归
void Move(int n,char x,char y) ;//交换//定义交换函数
void Move(int n,char x,char y)
{cout<<"把"<<n<<"号从"<<x<<" ==>移动到"<<y<<endl;
} //递归
void Hannoi(int n,char a,char b,char c) { if(n==1) //如果n==1,直接从A柱搬到C柱Move(1,a,c); else { int count=0;++count;Hannoi(n-1,a,c,b); //先将上面的n-1块从A柱借助C柱搬到B柱,即Hanoita(A,C,B,n-1);Move(n,a,c); //A柱上仅剩1块,直接从A柱搬到C柱;Hannoi(n-1,b,a,c); //再将B柱上的n-1块借助A柱搬到C柱,即Hanoita(B,A,C,n-1)} } //非递归//用来表示每根柱子的信息
struct st
{ int s[MAX]; //柱子上的圆盘存储情况 int top; //栈顶,用来最上面的圆盘 char name; //柱子的名字,可以是A,B,C中的一个 int Top() //取栈顶元素 { return s[top]; } int Pop() //出栈 { return s[top--]; } void Push(int x)//入栈 { s[++top] = x; }
} ; //声明
long Pow(int x, int y); //计算x^y
void Creat(st ta[], int n); //给结构数组设置初值
void Hanoita(st ta[], long max); //移动汉诺塔的主要函数 //给结构数组设置初值
void Creat(st ta[], int n)
{ ta[0].name = 'a'; ta[0].top = n-1; //把所有的圆盘按从大到小的顺序放在柱子A上 for (int i=0; i<n; i++) ta[0].s[i] = n - i; //柱子B,C上开始没有没有圆盘 ta[1].top = ta[2].top = 0;for (int i=0; i<n; i++) ta[1].s[i] = ta[2].s[i] = 0; //若n为偶数,按顺时针方向依次摆放 A B C if ( n%2 == 0) { ta[1].name = 'b'; ta[2].name = 'c'; } else //若n为奇数,按顺时针方向依次摆放 A C B { ta[1].name = 'c'; ta[2].name = 'b'; }
} //计算x^y
long Pow(int x, int y)
{ long sum = 1; for (int i = 0; i < y; i++) sum *= x; return sum;
} //移动汉诺塔的主要函数
void Hanoita(st ta[], long max)
{ int k = 0; //累计移动的次数 int i = 0; int ch; while (k < max) { //按顺时针方向把圆盘1从现在的柱子移动到下一根柱子 ch = ta[i%3].Pop(); ta[(i+1)%3].Push(ch); cout <<"Step"<< ++k << ": " "把" <<ch<<"号从" << ta[i%3].name <<"==>移动到" << ta[(i+1)%3].name << endl; i++; //把另外两根柱子上可以移动的圆盘移动到新的柱子上 if (k < max) { //把非空柱子上的圆盘移动到空柱子上,当两根柱子都为空时,移动较小的圆盘 if (ta[(i+1)%3].Top() == 0 || ta[(i-1)%3].Top() > 0 && ta[(i+1)%3].Top() > ta[(i-1)%3].Top()) { ch = ta[(i-1)%3].Pop(); ta[(i+1)%3].Push(ch); cout <<"Step"<< ++k << ": " << "把" <<ch<<"号从"<< ta[(i-1)%3].name << "==>移动到" << ta[(i+1)%3].name << endl; } else { ch = ta[(i+1)%3].Pop(); ta[(i-1)%3].Push(ch); cout <<"Step"<< ++k << ": " << "把" <<ch<<"号从"<< ta[(i+1)%3].name << "==>移动到" << ta[(i-1)%3].name << endl; } } } }int main()
{//递归cout<<"开始递归挪动------------------------------"<<endl;cout<<"请输入铁块数目:";int N = 0;cin >> N;Hannoi(N,'a','b','c'); //非递归cout<<"开始非递归挪动----------------------------"<<endl;int n; cout<<"请输入铁块数目:";cin >> n; //输入圆盘的个数 st ta[3]; //三根柱子的信息用结构数组存储 Creat(ta, n); //给结构数组设置初值 long max = Pow(2, n) - 1; //动的次数应等于2^n - 1 Hanoita(ta, max); //移动汉诺塔的主要函数 system("pause");return 0;
}
运行结果
五::C++递归与非递归实现设计求两个自然数的最大公约数
代码实现
#include <iostream>
using namespace std;//C++递归与非递归实现汉诺依塔(Hanoi塔)
//思路:当两个数取余等于0,直接返回分母
//当分子大于分母递归
//当分母大于分子,交换一下//声明
int digui(int , int);//递归
int feidigui(int , int);//非递归//递归
int digui(int a, int b)
{int result;//a: 分子 b:分母int temp;//当分母大于分子时//方法一:可以直接交换用函数递归//方法二:可以直接交换传值if(a < b) //digui(b,a);{temp = a;a = b;b = temp;} if(b == 0)//a%b==0{return a;}else{result = digui(b, a % b);}return result;
}//非递归
int feidigui(int a, int b){int result;//保存最大公约数 /*根据两数最小确定循环次数*/ int min;if(a > b){min = b;}else{min = a;}for(int i = 1; i <= min; i++){if(a % i == 0 && b % i == 0){result = i;}}return result;
}int main()
{int num1, num2;cout << "请输入第1个数字: ";cin >> num1;cout << "请输入第2个数字: ";cin >>num2;cout << "用 递归求最大公约数为: ";cout << digui(num1, num2) << endl;cout << "用非递归求最大公约数为: "; cout << feidigui(num1, num2) << endl;system("pause");return 0;
}
运行结果
六:C/C++多文件分文件编写程序编程实现小学生四则运算测试题并根据答题情况给出成绩
C++函数分文件代码实现步骤
第一步:创建项目
第二步:创建一个XXX.h的头文件
第三步:创建一个XXX.cpp的源文件
第四步:在源文件(XXX.cpp)中写函数的定义
#include "TestFile.h"bool Examine(int opd1 , int opt , int opd2) { int Answer , Result;switch (opt){case 1: cout<<opd1<<"+"<<opd2<<"="<<endl;cin>> Answer;Result=opd1+opd2; break;case 2:cout<<opd1<<"-"<<opd2<<"="<<endl;cin>> Answer;Result=opd1-opd2;break;case 3:cout<<opd1<<"*"<<opd2<<"="<<endl;cin>> Answer;Result=opd1*opd2;break;case 4:cout<<opd1<<"/"<<opd2<<"="<<endl;cin>> Answer;Result=opd1/opd2;break;default:cout<<"非合法字符"<<endl;break;}return Answer==Result; }int Test() {int i,opd1,opd2,ti=1;int count=0;int opt;int num,name;cout <<"同学,请输入你的学号:"<<endl;cin >>num;cout <<"同学,请输入你的姓名:"<<endl; cin >>name;cout <<"温馨提示:现在开始考试,满分100分,每题10分!"<<endl;srand((unsigned)time(NULL));for (i = 0; i < 10; i++){ opd1 = rand() % 100 + 50;opd2 = rand() % 50 + 1;opt = rand() % 4 + 1;//生成1~5随机数cout<<"请输入第"<<ti<<"题的答案:"<<endl;ti++;if (Examine(opd1 , opt , opd2)==1){count+=10;}}cout <<"系统开始阅卷---------------------------------"<<endl;cout <<"学号"<<num<<" "<<"姓名"<<name<<endl;cout <<"您的成绩为:"<< count<<"分"<<endl;return count ; }
第五步:在头文件(XXX.h)中写函数的声明,调用函数
#include <iostream> #include <stdlib.h> #include <ctime> #include <cmath> using namespace std;bool Examine(int opd1 , int opt , int opd2); int Test();int main(){Test();system("pause");return 0; }
运行结果
C++第七次作业(函数_递归与非递归_多文件)相关推荐
- 二叉树的先中后序递归和非递归遍历(数据结构作业)
一.设计思想 我创建二叉树是用的先序创建,其中用'#'代表空节点. 1.递归先序遍历 (1)如果当前节点为空节点(用'#'代表空节点),结束当前函数 (2)打印当前节点 (2)递归当前节点的左子树 ( ...
- 编写函数 int fac(int x)计算 x!的值。在主函数中输入 n 和 m 的值,通过调用函数 fac 计算m Cn 的值(要求分别用递归和非递归的方法编写函数 fac)
编写函数 int fac(int x)计算 x!的值.在主函数中输入 n 和 m 的值,通过调用函数 fac 计算m Cn 的值(要求分别用递归和非递归的方法编写函数 fac) 递归: #includ ...
- c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...
点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...
- 分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数
分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数 #include #include #define MAXSIZE 50 typedef char datatype; typedef ...
- python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
- 二叉树层序遍历递归与非递归_二叉树基础(1)-构建和遍历(递归和非递归)...
二叉树的构建有2种方式:1.直接输入数字.2.根据两种顺序来判断另外一中顺序(后面会提到) 这里分享第一种构建方式,二叉树的前中后三种遍历方式(递归和非递归版本),和二叉树的层次遍历. 见代码demo ...
- C和指针之函数之实现阶乘和斐波那契数(递归和非递归)
1.问题 实现阶乘和斐波那契数(递归和非递归) 2.代码实现 #include <stdio.h>int num = 0; //递归实现斐波那契数 // n <=2, f(n) = ...
- java 递归改非递归_使用Java ThreadLocals的意外递归保护
java 递归改非递归 对于那些使用第三方工具来尝试扩展它们而又不完全了解它们的人来说,这是一个小技巧. 假定以下情况: 您想扩展一个展示分层数据模型的库(假设您要扩展Apache Jackrabbi ...
- java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法
题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...
最新文章
- 福利 | Python、深度学习、机器学习、TensorFlow 好书推荐
- gcc编译报错:undefined reference to `std::cout‘
- Pandas简明教程:三、Pandas文件读写
- query什么意思php,关于 QueryPHP
- C语言中的“悬空指针”和“野指针”是什么意思?
- java 接口强制转换_三分钟学习Java泛型中T、E、K、V、?的含义
- php中页面平滑回到顶部代码,原生JS实现平滑回到顶部组件
- Struts 2读书笔记-----使用Action的动态方法调用
- jeesite如何配置swagger_Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解...
- 基于MATLAB语音识别系统GUI界面
- eigen向量计算_Eigen矩阵基本运算
- 创新工场李开复:漫延——中国移动互联网的2011年
- 被使用次数最多的22个Python外部模块
- Seq2Seq模型中的序列解码策略
- 渗透测试——joker靶场漏洞复现
- 嵌入式开发的那些年--aiku
- 【已解决-靠谱】windows server 2019安装net3.5方法
- TFS淘宝分布式文件核心存储引擎源码架构剖析实现
- 6. LED 点阵屏
- html把毫秒转换成年月日,如何使用JavaScript将毫秒转换为日期格式?