这是情景问题:
青蛙只向前移动,但它可以步长1英寸或跳跃2英寸长。青蛙可以使用不同的步骤和跳跃组合覆盖相同的距离。
编写一个函数,计算青蛙可以用来覆盖给定距离的不同组合的数量。
例如,可以通过三种方式覆盖3英寸的距离:步进步骤,步进跳跃和跳跃步骤。
public class Frog{
public static int numberOfWays(int input) {
int counter = 2;
int x = 0;
for (int i = 1 ; i< input -1; i++ ){
x = i + counter;
counter = x;
}
if (input <3){
x = input;
}
return x;
}
public static void main(String[] args) {
System.out.println(numberOfWays(10));
}
}
这个解决方案只给了我50%不确定为什么它不是%100,我用其他值测试它并返回正确的结果。
答案 0 :(得分:7)
我认为递归是一种很好的解决问题的方法
public int numberOfCombinations(int distance) {
if (distance == 1) {
return 1; //step
} else if (distance == 2) {
return 2; // (step + step) or jump
} else {
return numberOfCombinations(distance - 1) + numberOfCombinations(distance - 2);
// we jumped or stepped into the current field
}
}
答案 1 :(得分:4)
让f[n]
为步数和跳跃组合的数量,使您行进n
英寸。您可以立即看到f[n] = f[n-1] + f[n-2]
,首先您可以以某种方式行驶n-1
英寸然后使用1步,或者您可以以某种方式行驶n-2
英寸然后使用1跳。自f[1] = 1
和f[2] = 2
后,您可以看到f[n] = fib(n+1)
,n+1
- Fibonacci number。如果符合此目的,您可以在linear time中进行计算,或者更有效地,您可以在log n
时间内计算出来reference
答案 2 :(得分:2)
问题是Fibonacci系列的修改版本。我得到100%以下(对不起它的C#,但非常相似):
using System;
public class Frog
{
public static int NumberOfWays(int n)
{
int firstnumber = 0, secondnumber = 1, result = 0;
if (n == 1) return 1;
if (n == 2) return 2;
for (int i = 2; i <= n + 1; i++)
{
result = firstnumber + secondnumber;
firstnumber = secondnumber;
secondnumber = result;
}
return result;
}
public static void Main(String[] args)
{
Console.WriteLine(NumberOfWays(3));
Console.WriteLine(NumberOfWays(4));
Console.WriteLine(NumberOfWays(5));
Console.WriteLine(NumberOfWays(6));
Console.WriteLine(NumberOfWays(7));
Console.WriteLine(NumberOfWays(8));
}
}
答案 3 :(得分:1)
考虑重叠的子问题/动态编程。您需要记住对子问题的重复调用,这将永远为您节省时间。
答案 4 :(得分:0)
我相信这应该涵盖您的所有情况。
public static string numberOfCombinations(int distance)
{
if (distance == 1) {
return "Step";//1
} else if (distance == 2) {
return "Jump";//2
} else{
return numberOfCombinations(1) + numberOfCombinations(distance - 1);
}
}