递归问题1

java代码实现案例一@[算法]

递归问题1

题面描述:
楼梯有n阶,可以一步上一阶、两阶或三阶,问有多少种不同的走法
由于答案很大,mod(1e9+7)输出,
输入数据:
一个正整数n,代表楼梯的阶数,n<=1000000
输出数据:
方案数

java代码实现:

解题思路:
1.将每次递归的次数存储,同样的子问题只需要计算一次就行,用方法countwaysdp的方法实现对于每个子问题需要行走步数的计算,从而实现对于每个问题只计算一次,不重复计算,最终实现计算所得的方案数。
2.当有n个台阶(n>3)时,我们缩小问题规模,可以这样想:最后是一步上1个台阶的话,之前上了n-1个台阶,走法为f(n-1)种,而最后是一步上2个台阶的话,之前上了n-2个台阶,走法为f(n-2)种,故而f(n)=f(n-1)+f(n-2)。列出的递归方程为:f(1)=1;f(2)=2;
具体代码:

import java.util.*;  
public class Main {  
 public static int countwaysdp(int n,int dp[]) {
  if(n<0) return 0;
  if(n==0) return 1;
  if(dp[n]>0) return dp[n];
  else {
   dp[n]=countwaysdp(n-1,dp)+countwaysdp(n-2,dp)+countwaysdp(n-3,dp); //否则 还需计算该数组 
            return dp[n]; 
  }
 }
 public static void main(String args[]) {  
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] l1=new int[n+1];
        int b=countwaysdp(n,l1);
        System.out.println(b);
        
    }
}  

结语:
通过以上的递归方法实现了我们要解决的问题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值