当前位置: 首页 > 知识库问答 >
问题:

递归函数-楼梯

孟自强
2023-03-14

我一直专注于递归函数,并在网上搜索了一些问题,以了解它们是如何工作的。我遇到了一个叫做楼梯的问题,这是为它设计的代码-

#include<bits/stdc++.h>

using namespace std;

int staircase(int n){
    if(n<0){            //Base Case 1
        return 0;
    }

    if(n==0){           //Base Case 2
        return 1;
    }

    int count = 0;
    count += staircase(n-1);    //Stepping 1 step
    count += staircase(n-2);    //Stepping 2 step
    count += staircase(n-3);    //Stepping 3 step

    return count;
}

int main(){
    int n;
    cout<<"Enter number of stairs\n";

    cin>>n;

    cout<<"No of ways to climb stairs are ";
    cout<<staircase(n)<<endl;

    return 0;
}

如果有人能帮我从“int count”{I have understand the base cases}理解阶梯函数,那将非常有帮助!

共有2个答案

居飞扬
2023-03-14

在每次函数调用中,您都需要爬n个楼梯。在一次尝试中,你可以爬一个楼梯、两个楼梯或三个楼梯。因此,您使用n=n-1再次调用该函数,并将其结果添加到计数中。这个调用表示您只爬了一个楼梯(还有n-1个楼梯要爬)。同样,您可以添加爬2个楼梯后可能的方式数(n=n-2)和爬3个楼梯后可能的方式数(n=n-3)。注意,这个函数是指数函数,如果n是一个大数字,则需要很长时间。你可以通过使用记忆来解决这个问题。

#include<bits/stdc++.h>

using namespace std;

const int MAX_SIZE = 100;

long long mem[MAX_SIZE];

int staircase(int n){
    if(n<0){            //Base Case 1
        return 0;
    }

    if(n==0){           //Base Case 2
        return 1;
    }

    if (mem[n] != -1)
        return mem[n];

    int count = 0;
    count += staircase(n-1);    //Stepping 1 step
    count += staircase(n-2);    //Stepping 2 step
    count += staircase(n-3);    //Stepping 3 step

    return mem[n] = count;
}

int main(){

    for (int i = 0; i < MAX_SIZE; i++)
        mem[i] = -1;

    int n;
    cout<<"Enter number of stairs\n";

    cin>>n;

    cout<<"No of ways to climb stairs are ";
    cout<<staircase(n)<<endl;

    return 0;
}

这是使用memoization后的代码。请注意,如果没有记忆,计算所需的时间将非常长。例如,尝试使用n=50运行代码,并使用此代码进行尝试。还要注意的是,即使可以将MAX_SIZE设置为100000左右,在n=100之前,结果也会非常大。如果您真的想计算n的大值的结果,可以使用所谓的“大整数”。

拓拔野
2023-03-14

从本质上讲,这段代码试图找到可以到达步骤n的方法。如果可以执行步骤1、2或3,则可以从步骤n-1、n-2和n-3到达步骤n。因此,到达步骤n的方法数是到达步骤n-1、n-2和n-3的方法数之和。代码使用递归来实现这一点,通过使用不同的步长调用自身3次。

 类似资料:
  • 问题 你想在一个函数中调用相同的函数。 解决方案 使用一个命名函数: ping = -> console.log "Pinged" setTimeout ping, 1000 若为未命名函数,则使用 @arguments.callee@: delay = 1000 setTimeout((-> console.log "Pinged" setTimeout arg

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n 所以,fact(n)可以表示为n x fact(n-1),

  • 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n)=n!=1\times2\times3\times\cdot\cdot\cdot\times(n-1)\times n=(n-1)!\times n=fact(n-1)\times n

  • 我还不太理解递归,我有一些作业我不能解决。有人有主意吗? 任务1:实现一个int方法max(int[]arr,int i),该方法返回arr中所有元素的最大值和索引 这是我迄今为止的代码: 实际上它是有效的,但它的风格很差,所以我的问题是:如果没有私有静态int max,我如何实现递归方法?我不允许向该方法添加第三个参数。 任务2:实现一个布尔方法包含值(int[]arr,int val),如果a

  • Go语言支持递归函数,这里是一个经典的斐波拉切数列的列子。 package main import "fmt" // fact函数不断地调用自身,直到达到基本状态fact(0) func fact(n int) int { if n == 0 { return 1 } return n * fact(n-1) } func main() { fmt.

  • Scala 函数 递归函数在函数式编程的语言中起着重要的作用。 Scala 同样支持递归函数。 递归函数意味着函数可以调用它本身。 以上实例使用递归函数来计算阶乘: object Test { def main(args: Array[String]) { for (i <- 1 to 10) println(i + " 的阶乘为: = " + factori