重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这个应该是计算阶乘的递归函数
创新互联公司是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十年时间我们累计服务了上千家以及全国政企客户,如成都轻质隔墙板等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致称赞。
其实递归函数的结构很简单,一般是两部分组成
1、判断是否结束递归。
作用是结束递归调用,递归调用不可能无限的调用下去,要不然成了死循环了,呵呵
所以要有一个结束的条件,如这里的if(n==0||n==1) return 1
2、调用本身(或者其他函数(有双线递归和多线递归))
这里就是递归的本质函数了,他有两个地方要注意
1)就是递归的公式,以什么条件来运算
这里的公式是递归函数的返回值和参数相乘
2)就是需要改变函数的参数,要不然也会成为死循环
这里是fac(n-1),这个n-1就是改变了参数
多线递归和这个也差不多,只有一个地方不同,就是调用的函数不是本身,是另一个递归函数
如a调用b,b在调用c,c调用a等等
#include iostream
#include algorithm
#include string
#include cstdlib
#include set
#include cmath
#include cstdio
#include cstring
#include vector
#include map
#include stack
#include queue
#include cctype
#define LL long long
using namespace std;
const LL inf = 1e18;
const LL mod = 1e9+7;
int s[10] = {1, 3, 6, 10, 15, 21, 27};
int m;
void f(int n, int k, int cnt) {
if(n == 1) {
return;
}
else if(cnt == 0) {
cnt = m - k - 1;
k = m;
f(cnt + 1, k, cnt);
printf("%d\n", cnt + 1);
}else {
f(n + k, k - 1, cnt - 1);
printf("%d ", n + k);
}
}
int main() {
//1 3 6 10 15 21 27
//1 2 3 4 5 6 7
//s = (1 + n) * n / 2
int n;
while(scanf("%d", n) != EOF) {
int k = lower_bound(s, s + 7, n) - s;
m = k;
f(k + 1, k, k);
printf("%d\n", k + 1);
}
return 0;
}
效果
仓促之间写出,也就这样了
这问题实在是有意思啊,主要是比较忙,我其实还想好好想想,为了财富值直接回答了
请用c++来编译,也就是g++编译器,头文件有的没用,懒得去掉了,你可以输入类似这种格式的数据来试验,不过最大也就是数组里面最大的,别超出。
注:输入数据格式请看代码s数组
写的不太好,不要介意
求采纳,谢谢
这是一个递归调用fun(x)的算法。
首先会计算x=1时,因为x是int型,所以x/2==0,返回1,所以打印1.
然后再计算x=2时,这时返回x%2=0,所以打印0;
再计算x=4时,同样返回x%2=0,所以打印0;
最后计算x=8时,返回x%2=0,所以打印0。
所以屏幕输出的就显示1000 。
首先要理解递归的概念,先递后归
开始递
get(1) n=1不成立,执行else
get(2) n=2不成立,执行else
get(3) n=3不成立,执行else
get(4) n=4不成立,执行else
get(5) n=5不成立,执行else
get(6) n=6不成立, 执行else
get(7) n=7不成立, 执行else
get(8) n=8不成立, 执行else
get(9) n=9不成立 执行else
get(10) n=10成立,返回值1
开始归!
get(10) num=1
get(9) get(n+1)*2+2 = 1*2+2=4 //这里说下为什么不在递的时候计算else呢?因为在递的时候我们并不知道他们上一次的值,所以是没办法计算的,这里get(n+1)已经知道了上一次的值get(10)是1。
get(8) get(n+1)*2+2 = 4*2+2 =10
get(7) get(n+1)*2+2 = 10*2+2 = 22
get(6) get(n+1)*2+2 = 22*2+2 = 46
get(5) get(n+1)*2+2 = 46*2+2 = 94
get(4) get(n+1)*2+2 = 94*2+2 = 190
get(3) get(n+1)*2+2 = 190*2+2 = 382
get(2) get(n+1)*2+2 = 382*2+2 = 766
get(1) get(n+1)*2+2 = 766*2+2 = 1534
至此递归条件结束
递归函数有三点要求:
1,递归的终止点,即递归函数的出口
2,不断的递归调用自身
3,递归函数主体内容,即递归函数需要做的事情
ps:3一般可以放在2的前面或者后面,一般1放最前面。另外,2和3可以根据不同的需要合并,比如,有时候递归函数的主体就是返回调用下层函数所得到的结果。
具体例子如下:
void fun(int n)
{
if(n=0) return; //1 这是递归的终点,即出口
fun(n-1); //2、递归函数自身的调用
coutnendl; //3 递归函数的主体内容
}
2,3合并的情况
int fun(int n)
{
if(n=0) return 0;
return fun(n-1)+fun(n-2); //2 3合并
}
专门在递归函数中设置一个形式参数求各个数字的阶乘。代码如下:
代码文本:
#include "stdio.h"
int f10(int m,int n){
return n11 ? m+f10(m*(n+1),n+1) : 0;
}
int main(int argc,char *argv[]){
printf("1!+2!+3!+...+10! = %d\n",f10(1,1));
return 0;
}