【问题标题】:Fibonacci series using alternate approach is not working使用替代方法的斐波那契数列不起作用
【发布时间】:2015-04-03 02:29:27
【问题描述】:

我使用递归编写了一个简单的斐波那契数列,如下所示。但下面的程序是基于公式fib(n)=fib(n-1)+fib(n-2)

我们是否可以编写一个程序来获取 n 的值并使用公式 fib(n+2)= fib(n)+fib(n+1) 计算斐波那契数列。我们可以根据这个以 n 作为输入的公式编写程序吗?

 public class FibonacciClass{

  public static void main(String[] argv){

      for (int index=0; index < 7; index++){
          System.out.println("The Fibonacci series for the number "+index+" is " + fib(index));
      }

  }

  private static int fib(int n){
        if (n == 0 ) return 0;
        if (n <= 2 ) return 1;

      return (fib(n-1) + fib(n-2));
  }
}

如果我们可以使用递归解决 fib 系列,请告诉我您编写程序的输入。

【问题讨论】:

    标签: recursion tail-recursion


    【解决方案1】:

    嗯,这听起来像是您正在尝试回答家庭作业问题。但看起来你有合法的声誉,所以:

    定义 gib(n) = fib(n+2)。 用它来代替 fib(n) 和 fib(n+1):

    gib(n-2) = fib((n-2)+2) = fib(n)

    gib(n-1) = fib((n-1)+2) = fib(n+1)

    所以原来的方程变成了

    fib(n+2)= fib(n)+fib(n+1) --> gib(n) = gib(n-2) + gib(n-1)

    我们可以对此进行递归。我们必须在代码中进行类似的替换(n 替换 n+2):

    static unsigned int gib(int n)
    {
      if (n <= -2) return 0;
      if (n == -1) return 1;
      return gib(n - 2) + gib(n - 1);
    }
    

    我没有包含导致负斐波那契的负数(您的代码也中断了它们),所以它确实需要返回“无符号整数”。要修改为否定,请参阅here

    【讨论】:

    • 您好,感谢您的意见。我的问题有点不同。例如,如果我们想遍历一个数组,我们可以用两种方式来点它。第一种方法是在 for 循环中从 0 开始索引到列表的末尾。第二种方法是从列表的末尾开始,每次在 for 循环内递减索引。我发布的程序是使用前两个 fib 数字生成 fib 系列的地方。可以像我们在数组示例中看到的那样以相反的方式完成吗?
    • 我不认为这是可能的,因为 fib 系列的定义是给定索引的结果取决于先前索引的结果。也许有一些理论上的方法可以将所有(无限)结果从正无穷变为您的数字,以便确定您的数字之前的结果。也许您可以尝试 math.stackexchange.com(免责声明:我自己从未尝试过),但它可能无法编码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多