查看: 2145|回复: 12

求一递归算法

  [复制链接]

神隐的主犯

梦石
0
星屑
553
在线时间
271 小时
注册时间
2008-2-22
回帖
7534

贵宾

发表于 2008-9-10 19:59:07 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
题目是这样的:

    有一个 N 层台阶, 可以一次上一层台阶, 也可以一次上三成台阶,问有多少种走法?

要求1: 用递归;

要求2: 给个思路就可以啦。

谢谢大家{/hx}。

《天空之城 —— 破碎的命运》
梦石
0
星屑
60
在线时间
41 小时
注册时间
2008-3-5
回帖
1992
发表于 2008-9-10 20:37:42 | 显示全部楼层
Fibonacci数列
回复

使用道具 举报

神隐的主犯

梦石
0
星屑
553
在线时间
271 小时
注册时间
2008-2-22
回帖
7534

贵宾

 楼主| 发表于 2008-9-10 20:39:51 | 显示全部楼层
以下引用hitlerson于2008-9-10 12:37:42的发言:

Fibonacci数列


为什么会是 Fibonacci??

《天空之城 —— 破碎的命运》
回复

使用道具 举报

梦石
0
星屑
60
在线时间
41 小时
注册时间
2008-3-5
回帖
1992
发表于 2008-9-10 20:49:23 | 显示全部楼层
1  1
2  11
3  111 3

第N步是前一步前加1和前三步前加3

如 4 是 3前加1和1前加3
你它囧一字母君谁记得……
当时那把剑离我的喉咙只有0.01工分。可是一柱香之后,这个女主人会深深的爱上我,虽然本人平生说了无数的谎话,可是这句最有效:“你应该这么做,我也应该死。
曾经有一取ID的机会放在我面前,我没有珍惜,等我失去的时候我才后悔莫及,人世间最痛苦的事莫过于此。你的剑在我的咽喉上割下去吧!不用再犹豫了!如果上天能够给我一个再来一次的机会,我绝对会取个汉字君。如果非要给这ID加点修饰的话,我希望是……红色加粗……

回复

使用道具 举报

梦石
0
星屑
60
在线时间
41 小时
注册时间
2008-3-5
回帖
1992
发表于 2008-9-10 20:51:24 | 显示全部楼层
Dim i As Long
If stairnum = 1 Then
methodn = 1
ReDim steps(1 To methodn)
steps(1) = 1
End If
If stairnum = 2 Then
methodn = 1
ReDim steps(1 To methodn)
steps(1) = 11
End If
If stairnum = 3 Then
methodn = 2
ReDim steps(1 To methodn)
steps(1) = 111
steps(2) = 3
End If
If stairnum > 3 Then
Dim a() As String, b() As String, methoda As Long, methodb As Long
upstairs stairnum - 1, a, methoda ’递归调用

upstairs stairnum - 3, b, methodb  '递归调用
ReDim steps(methoda + methodb)
For i = 1 To methoda
steps(i) = 1 & a(i)
Next
For i = 1 To methodb
steps(i + methoda) = 3 & b(i)
Next
methodn = methoda + methodb
End If

End Sub
系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
你它囧一字母君谁记得……
当时那把剑离我的喉咙只有0.01工分。可是一柱香之后,这个女主人会深深的爱上我,虽然本人平生说了无数的谎话,可是这句最有效:“你应该这么做,我也应该死。
曾经有一取ID的机会放在我面前,我没有珍惜,等我失去的时候我才后悔莫及,人世间最痛苦的事莫过于此。你的剑在我的咽喉上割下去吧!不用再犹豫了!如果上天能够给我一个再来一次的机会,我绝对会取个汉字君。如果非要给这ID加点修饰的话,我希望是……红色加粗……

回复

使用道具 举报

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
回帖
6005

烫烫烫开拓者

发表于 2008-9-10 21:59:16 | 显示全部楼层
Ruby
msxjie = 5
no = 0
sub upsta(n)
  if (n =msxjie) then
    no += 1
  end
  upsta(n+1)
{  upsta(n+2)}
  upsta(n+3)
end
Pascal:
var msxjie:integer;
var no:integer;
msxjie := 5;
no := 0;
procedure upsta(n:integer);
begin
  if (n =msxjie) then begin
    no += 1;
exit;
end;
  upsta(n+1);
  upsta(n+2);
  upsta(n+3);
end;
begin
upsta(0) {0还是1记不得鸟}
no就是答案
end.
不知什么原因,其实就是菲波纳妾数列
系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
哎呀,蛋疼什么的最有爱了
回复

使用道具 举报

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
回帖
6005

烫烫烫开拓者

发表于 2008-9-10 22:02:07 | 显示全部楼层
vb(最简单的,速度最快的,不会栈溢出的):
n = Inputbox("台阶数")

结果=(1/sqrt(5))*(((1+sqrt(5))/2)^n - ((1-sqrt(5))/2)^n)
哎呀,蛋疼什么的最有爱了
回复

使用道具 举报

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
回帖
6005

烫烫烫开拓者

发表于 2008-9-10 22:07:19 | 显示全部楼层
可以一次上一层台阶, 也可以一次上三成台阶
记忆里是
可以一次上一层台阶, 也可以一次上两成台阶

原理的话:
转载:
首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。

现在我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶时的不同跳法的总数f(n)=f(n-1)+(f-2)。

我们把上面的分析用一个公式总结如下:

        /  1                          n=1
f(n)=      2                          n=2
        \  f(n-1)+(f-2)               n>2

分析到这里,相信很多人都能看出这就是我们熟悉的Fibonacci序列。
哎呀,蛋疼什么的最有爱了
回复

使用道具 举报

静

梦石
0
星屑
49
在线时间
157 小时
注册时间
2007-12-16
回帖
3031
发表于 2008-9-10 22:26:24 | 显示全部楼层
连3贴注意
回复

使用道具 举报

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
回帖
6005

烫烫烫开拓者

发表于 2008-9-11 00:38:37 | 显示全部楼层
以下引用做游戏的新手于2008-9-10 14:26:24的发言:

连3贴注意

抱歉我太激动了,这个问题我们曾经讨论过了3个小时
哎呀,蛋疼什么的最有爱了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部