算法设计 爬楼梯类型,共n阶楼梯,一次最多爬m阶,用JAVA或者C或者C++

JavaScript013

算法设计 爬楼梯类型,共n阶楼梯,一次最多爬m阶,用JAVA或者C或者C++,第1张

循环,,,,,好多循环,,,,哇,,,,实现了

#include<string.h>

#include<iostream>

#include<stack>

using namespace std

int main()

{

int n = 0, m = 0, sum = 0, cnt = 0

cout <<"输入阶梯数:" <<endl

cin >>n

cout <<"输入最多爬的阶梯数:" <<endl

cin >>m

if (n <= 0)

{

cout <<"就一种,上去了!" <<endl

}

if (m <= 0)

{

cout <<"你想上是不可能的!" <<endl

}

int i

stack<int>sk

do

{

if (sum <= n)

{

++cnt

while (sum <= n)

{

sk.push(1)

++sum

}

}

if (!sk.empty())

{

sum -= sk.top()

sk.pop()

}

else

{

cout <<cnt <<endl

return 0

}

HHH:

if (!sk.empty())

{

i = sk.top()

}

else

{

cout <<cnt <<endl

return 0

}

if (i <m)

{

++i

}

else

{

if (!sk.empty())

{

sum -= sk.top()

sk.pop()

goto HHH

}

else

{

cout <<cnt <<endl

return 0

}

}

if (!sk.empty())

{

sum -= sk.top()

sk.pop()

}

else

{

cout <<cnt <<endl

return 0

}

sk.push(i)

sum += i

} while (1)

return 0

}

求 1-100 的和

1,1,2,3,5,8,13,21,34,55,89...求第 n 项

JS 递归 假如楼梯有 n 个台阶,每次可以走 1 个或 2 个台阶,请问走完这 n 个台阶有几种走法

原理: clone(o) = new Object返回一个对象

1、很多时候可以用递归代替循环,可以理解为递归是一种特殊的循环,但通常情况下不推荐这样做。

2、递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。

3、递归在数据格式一致,在数据层级未知的情况下,比普通的遍历更有优势。

4、递归在异步的时候,更容易理解,且更容易实现,因为可以在异步的回调里面,调用自己来实现每次都能拿到异步的结果再进行其他操作。

5、递归实现的快速排序比普通遍历实现的排序效率更好。

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注:n 是一个正整数。

输入: 2

输出: 2

解释: 有两种方法可以爬到楼顶。

输入: 3

输出: 3

解释: 有三种方法可以爬到楼顶。

在暴力法中,我们将会把所有可能爬的阶数进行组合,也就是 1 和 2 。而在每一步中我们都会继续调用 climbStairs,climbStairs 这个函数模拟爬 1 阶和 2 阶的情形,并返回两个函数的返回值之和。

climbStairs(i,n) = climbStairs(i + 1, n) + climbStairs(i + 2, n)

其中 i 定义了当前阶数,而 n 定义了目标阶数。

在 n=5 时的递归树将是这样的:

在上一种方法中,我们计算每一步的结果时出现了冗余。另一种思路是,我们可以把每一步的结果存储在 memory 数组之中,每当函数再次被调用,我们就直接从 memory 数组返回结果。

在 memory 数组的帮助下,我们得到了一个修复的递归树,其大小减少到 n 。

不难发现,这个问题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效地构建,我们可以使用动态规划来解决这一问题。

第 ii 阶可以由以下两种方法得到:

在第 (i-1) 阶后向上爬 1 阶。

在第 (i-2) 阶后向上爬 2 阶。

所以到达第 i 阶的方法总数就是到第 (i−1) 阶和第 (i−2) 阶的方法数之和。

令 dp[i] 表示能到达第 i 阶的方法总数:

dp[i]=dp[i-1]+dp[i-2]

在上述方法中,我们使用 dp 数组,其中 dp[i]=dp[i-1]+dp[i-2]。可以很容易通过分析得出 dp[i] 其实就是第 i 个斐波那契数。

Fib(n)=Fib(n-1)+Fib(n-2)

现在我们必须找出以 1 和 2 作为第一项和第二项的斐波那契数列中的第 n 个数,也就是说 Fib(1)=1 且 Fib(2)=2。

方法 5: Binets 方法

算法

这里有一种有趣的解法,它使用矩阵乘法来得到第 nn 个斐波那契数。矩阵形式如下:

按照此方法,第 nn 个斐波那契数可以由 Q n-1 [0,0] 给出。

让我们试着证明一下。

我们可以使用数学归纳法来证明这一方法。易知,该矩阵给出了第 3 项(基本情况)的正确结果。由于

这证明基本情况是成立的。

假设此方法适用于查找第 nn 个斐波那契数,即 F n =Q n-1 [0,0],那么:

现在,我们需要证明在上述两个条件为真的情况下,该方法可以有效找出第 (n+1) 个斐波那契数,即,F n+1 =Q n [0,0]。

证明:

从而, F n+1 =Q n [0,0]。得证。

我们需要为我们的问题做的唯一改动就是将斐波那契数列的初始项修改为 2 和 1 来代替原来的 1 和 0 。或者,另一种方法是使用相同的初始矩阵 Q 并使用 result = Q n [0,0] 得出最后结果。发生这种情况的原因是我们必须使用原斐波那契数列的第 2 项和第 3 项作为初始项。

我们可以使用这一公式来找出第 n 个斐波那契数:

对于给定的问题,斐波那契序列将会被定义为 F 0 = 1,F 1 = 1,F 2 = 2,F n+2 = F n+1 + F n 。尝试解决这一递归公式的标准方法是设出 F n ,其形式为 F n = a n 。然后,自然有 F n+1 = a n+1 和 F n+2 = a n+2 ,所以方程可以写作 a n+2 = a n+1 + a n 。如果我们对整个方程进行约分,可以得到 a 2 = a + 1 或者写成二次方程形式 a 2 - a- 1= 0。

对二次公式求解,我们得到:

一般解采用以下形式:

n = 0时,有A + B = 1

n = 1时,有

解上述等式,我们得到:

将 AA 和 BB 的这些值带入上述的一般解方程中,可以得到: