扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
函数执行流程:
创新互联是一家专业提供射洪企业网站建设,专注与网站设计、网站建设、H5建站、小程序制作等业务。10年已为射洪众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。
开始:
fact(5) 函数结束
|
return 5 * fact(4) return 5 * 4* 2 *1
| |
return 4 * fact(3) return 4* 3* 2*1
| |
return 3 * fact(2) return 3* 2*1
| |
return 2 * fact(1) return 2* 1
| |
return 1 函数返回
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
函数嵌套调用过程示例
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
例如,下列为某人祖先的递归定义:
某人的双亲是他的祖先(基本情况)。某人祖先的双亲同样是某人的祖先(递归步骤)。斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21..... I[1]
斐波纳契数列是典型的递归案例:
递归关系就是实体自己和自己建立关系。
Fib(0) = 1 [基本情况] Fib(1) = 1 [基本情况] 对所有n 1的整数:Fib(n) = (Fib(n-1) + Fib(n-2)) [递归定义] 尽管有许多数学函数均可以递归表示,但在实际应用中,递归定义的高开销往往会让人望而却步。例如:
阶乘(1) = 1 [基本情况] 对所有n 1的整数:阶乘(n) = (n * 阶乘(n-1)) [递归定义] 一种便于理解的心理模型,是认为递归定义对对象的定义是按照“先前定义的”同类对象来定义的。例如:你怎样才能移动100个箱子?答案:你首先移动一个箱子,并记下它移动到的位置,然后再去解决较小的问题:你怎样才能移动99个箱子?最终,你的问题将变为怎样移动一个箱子,而这时你已经知道该怎么做的。
如此的定义在数学中十分常见。例如,集合论对自然数的正式定义是:1是一个自然数,每个自然数都有一个后继,这一个后继也是自然数。
德罗斯特效应是递归的一种视觉形式。图中女性手持的物体中有一幅她本人手持同一物体的小图片,进而小图片中还有更小的一幅她手持同一物体的图片,依此类推。
德罗斯特效应
又例如,我们在两面相对的镜子之间放一根正在燃烧的蜡烛,我们会从其中一面镜子里看到一根蜡烛,蜡烛后面又有一面镜子,镜子里面又有一根蜡烛……这也是递归的表现。
首先要理解递归的概念,先递后归
开始递
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
至此递归条件结束
需要有一个画直线的库函数供使用。以下讲思路。
定义点的类型为具有二维坐标,比如 struct point { double x; double y;} 之类。
定义多边形的类型为元素是点的线性表,比如链表 struct polygon { struct point *p; struct polygon* next; },
需要能按顺序访问各个点,并需要提供insert函数以做插入点操作。
从等边三角形开始,多边形包含起始的三个点,三个点构成等边三角形。
下面的思路是伪代码
p = 起始点head;
do {
1.每个点p与下一个点p-next构成多边形的一条边,求边长;
2.求出两个三等分点q1和q2(求两点构成的线段的距离并进一步求三等分点的方法写成函数,公式不用说了吧);
3.按顺序将q1和q2插入p和p-next之间;
4.以q1和q2为顶点求向外生长出的三角形的第三个顶点r(求r的坐标比较复杂一些,可以用公式,但我认为按q1q2与x轴的夹角分6种情况可以简化计算);
5.将r插入q1和q2之间;
6.p = p-next;
} while (p != 起始点head);
// 每完整循环一次增长一轮,考虑一下要循环几轮满足需要,从图看第二个图是循环3轮。
下面p依次遍历多边形每个点画线 drawline(p, p-next)
最后一个点与起始点head之间drawline(p, head)闭合图形。
完毕。
#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数组
写的不太好,不要介意
求采纳,谢谢
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流