腾讯面试题:50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?
分析题目:
到第一层只有一种情况上一阶即可即为1
到第二层有两种情况11和2
到第三层有111、12、21三种情况
到第四层有1111、121、112、22、211吴种情况
...
要到第50层要么从48层上两阶到达或者从49层上一阶到达
f(50)=f(49)+f(48)
同理:f(49)=f(48)+f(47)
归纳得通式
f(n)=f(n-1)+f(n-2) (n>=2)
解决递归:
1.找出递归终止的条件
2.找出递归关系式
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#include<stdio.h>
#include<stdlib.h>
double
calc_upstairs_recursion(int
n) //值比较大所以使用double
{
if(n==1)//找出递归终止条件
{
return
1;
}
else
if(n
==2)
{
return
2;
}
else
{
return
calc_upstairs_recursion(n-1)+calc_upstairs_recursion(n-2);//找出递归关系条件
}
}
double
calc_upstairs_loop(int
n)
{
double
*tmp =NULL;
double
sum = 0;
int
i;
if(n<=2)www.2cto.com
{
return
n;
}
tmp
=(double
*)malloc(sizeof(double)*n);
tmp[0]=
1;
tmp[1]
= 2;
for(
i=2;i<n;i++)
pre=""
return=""
sum="tmp[n-1];"
void="">2.给定个数组:int
a[10]=
{1,2,3,4,5,6,7,8,9,10};使用递归来判断数组a是否为递增序列?<p> </p><p> </p><p>1.找出递归终止的条件</p><p>2.找出递归关系式</p><pre
class="brush:java;">#include<stdio.h>
#include<stdlib.h>
int
is_increase(int
start_pos,int
length,int
*pdata)
{
if(start_pos==length-2)
//递归结束的条件
{
return
pdata[start_pos+1]>pdata[start_pos];
}
return
pdata[start_pos+1]>pdata[start_pos]&&is_increase(start_pos+1,length,pdata);//递归关系
}
void
main()
{
int
a[10]=
{1,2,3,4,5,6,7,8,9,10};
int
res=is_increase(0,10,a);
if(res
==1)
{
printf("是递增的\n");
}
else
{
printf("不是递增的\n");
}
system("pause");
}
}</stdlib.h></stdio.h></pre>
</n;i++)></stdlib.h></stdio.h><br>
<br>
|