Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何递归添加函数_Java_Algorithm - Fatal编程技术网

Java 如何递归添加函数

Java 如何递归添加函数,java,algorithm,Java,Algorithm,我不知道如何用JAVA写这个:有一个有N级台阶的楼梯,你可以一次爬上1级或2级台阶。给定N,编写一个函数,返回爬楼梯的唯一方式的数量。步骤的顺序很重要 例如,如果N为4,则有5种独特的方式: 1, 1, 1, 1 2, 1, 1 1, 2, 1 1, 1, 2 2, 2 如果不是一次只能爬1到2步,而是可以从一组正整数X中爬出任意数,会怎么样?例如,如果X={1,3,5},您可以一次爬1,3或5步 基本上,我可以做第一部分,并且理解逻辑中较难的部分,答案是:f(n)=f(n-1)+f(n-3)

我不知道如何用JAVA写这个:有一个有N级台阶的楼梯,你可以一次爬上1级或2级台阶。给定N,编写一个函数,返回爬楼梯的唯一方式的数量。步骤的顺序很重要

例如,如果N为4,则有5种独特的方式:

1, 1, 1, 1
2, 1, 1
1, 2, 1
1, 1, 2
2, 2
如果不是一次只能爬1到2步,而是可以从一组正整数X中爬出任意数,会怎么样?例如,如果X={1,3,5},您可以一次爬1,3或5步

基本上,我可以做第一部分,并且理解逻辑中较难的部分,答案是:f(n)=f(n-1)+f(n-3)+f(n-5)。有人能帮我吗?这是我的做法:

public static void main(String[] args) {
 int n = 4;
 Set < Integer > list = new HashSet < Integer > ();
 list.add(1);
 list.add(3);
 list.add(5);
 int ways = reachNFloorSet(list, n, 0);
 //     int ways = reachNFloor(n);
 System.out.println(n + " Floor is reached in " + ways + " different way/s.");
}


public static int reachNFloor(int n) { // easy part
 if (n <= 1) {
  return 1;
 }
 return reachNFloor(n - 1) + reachNFloor(n - 2);
}

public static int reachNFloorSet(Set < Integer > numbers, int n, int sum) {
 if (n < 0) {
  return 0;
 } else if (n == 0) {
  return 1;
 }

 for (Integer x: numbers) {
  if (x <= n) {
   sum += reachNFloorSet(numbers, n - x, sum);
  }
 }
 return sum;
}
publicstaticvoidmain(字符串[]args){
int n=4;
Setlist=newhashset();
增加第(1)款;
增加(3);
增加(5);
int ways=reachNFloorSet(列表,n,0);
//int通道=到达楼层(n);
系统输出打印项次(n+“以“+方式+”不同方式到达楼层”);
}
公共静态int REACHNLOOR(int n){//简单部分
if(n个数字,整数n,整数和){
if(n<0){
返回0;
}else如果(n==0){
返回1;
}
对于(整数x:数字){

如果当
n
为负或
reachNFloorSet()
中为0时(x),则返回0或1,但应返回
sum
sum+1
。否则,将丢弃所有累积的信息

我认为,最好重写您的方法,这样就不必担心已经采取了多少步骤:

public static int reachNFloorSet (Set<Integer> numbers, int n) {
    if (n == 0) {
        return 1;
    }

    int sum = 0;
    for(Integer x: numbers) {

        if (x <= n) {

            sum += reachNFloorSet(numbers, n-x);

        }
    }
    return sum;
}
public static int reachNFloorSet(集合编号,int n){
如果(n==0){
返回1;
}
整数和=0;
对于(整数x:数字){

如果(x)我投了赞成票,因为我认为这与stacktrace或调试无关。他只需要重新表述他的问题。他有一个问题需要帮助,因为他不确定如何设计这样的算法。递归不是解决这个问题的合理方法。你的算法会太慢和/或不必要地复杂伊格特。既然
reachNFloor
在没有
sum
参数的情况下运行良好,为什么要让
reachNFloorSet
使用
sum
参数?摆脱它来解决你的问题。@Mr00Anderson这完全是人们自己努力(研究)的结果在这里提问之前。调试代码是其中的一部分,所以否决票是合适的,因为否决票按钮的工具提示上写着“这个问题没有显示任何研究成果”@MattTimmermans-在我看来,递归是一种完全合理的方法。当然,您可以通过使用自己的堆栈记录决策来摆脱递归调用,但这几乎不会导致代码不那么复杂。您还有什么建议?