注册 登录
编程论坛 C语言论坛

通过函数的递归调用,实现:有n级台阶,一步可以上一级台阶,也可以一步上两级台阶,问上完n级台阶,有多少种走法?

m3440426898 发布于 2022-03-12 15:08, 2236 次点击
通过函数的递归调用,实现:有n级台阶,一步可以上一级台阶,也可以一步上两级台阶,问上完n级台阶,有多少种走法?
填空,顺便解释一下程序呗,下面自定义函数的功能,详细些。
#include <stdio.h>
int tj(int m);
main()
{
    int n;
    printf("请输入台阶的级数:");
    【1】;
    printf("走完%d级台阶有%d种走法\n",n,【2】);
}

int tj(int m)
{
    if(m==1)
        【3】;
    else if(m==2)
        【4】;
    else
        【5】;
}
5 回复
#2
rjsp2022-03-12 17:39
第i级台阶 可能是 第i-2级台阶跨上来的,也可能是 第i-1级台阶走上来的,
所以 f(n) = f(n-1) + f(n-2),即 走到第i级台阶的走法数量 = 走到第i-1级台阶的走法数量 + 走到第i-2级台阶的走法数量
它就是个斐波那契数列,f(0)=1, f(1)=1, f(2)=2, f(3)=3, f(4)=5, f(5)=8, f(6)=13, ……

程序代码:
#include <stdio.h>

unsigned foo( unsigned n );

int main( void )
{
    unsigned n;
    printf( "请输入台阶的级数:" );
    scanf( "%u", &n );
    printf( "走完%u级台阶有%u种走法\n", n, foo(n) );
}

unsigned foo( unsigned n )
{
    if( n == 1 )
        return 1;
    if( n == 2 )
        return 2;
    return foo(n-1) + foo(n-2);
    // 以上算法很恶心,且含bug,抱歉,因为是题目强制要求的
}
#3
m34404268982022-03-15 09:49
回复 2楼 rjsp
foo(i-1)+foo(i-2);这句,它不应该是先统计i-1,就是一次一步的走法,再统计i-2,一次两步的走法再加起来嘛,那一步两步混合呢?
#4
rjsp2022-03-15 16:29
以下是引用m3440426898在2022-3-15 09:49:55的发言:

foo(i-1)+foo(i-2);这句,它不应该是先统计i-1,就是一次一步的走法,再统计i-2,一次两步的走法再加起来嘛,那一步两步混合呢?

foo(n) 是走到第n级台阶的走法数量,不管是一步一级,还是一步两级,还是三奔一跳,……

随便举个例子,假如走到第9级台阶(随便怎么走)共有a种走法,走到第10级台阶(随便怎么走)共有b种走法,那走到第11级台阶必然是共有a+b种走法。
因为在第9级台阶上可以"一步上两级台阶"直接上到第11级台阶,所以走到9级的所有走法都可以最后"一步上两级台阶"到第11级台阶;
因为在第10级台阶上可以"一步上一级台阶"上到第11级台阶,所以走到10级的所有走法都可以最后"一步上一级台阶"到第11级台阶。
#5
m34404268982022-03-18 14:52
回复 4楼 rjsp
那bug在哪里呀
#6
rjsp2022-03-18 19:17
回复 5楼 m3440426898
当 n == 0 时,逻辑错误

明明可以写个正常的
程序代码:
unsigned foo( unsigned n )
{
    if( n == 0 )
        return 1;
    if( n == 1 )
        return 1;
    return foo(n-1) + foo(n-2);
}

另外,原代码用的竟然是int,没必要说,直接改掉
1