Java 如何递归添加函数
我不知道如何用JAVA写这个:有一个有N级台阶的楼梯,你可以一次爬上1级或2级台阶。给定N,编写一个函数,返回爬楼梯的唯一方式的数量。步骤的顺序很重要 例如,如果N为4,则有5种独特的方式: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)
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-在我看来,递归是一种完全合理的方法。当然,您可以通过使用自己的堆栈记录决策来摆脱递归调用,但这几乎不会导致代码不那么复杂。您还有什么建议?