【问题标题】:simplifying THIS fibonacci method [closed]简化这个斐波那契方法
【发布时间】:2021-04-19 01:49:24
【问题描述】:

所以我的工作是转换这种方法:

long fib(long n) {
long i = -1, a = 0, b = 1;
while (++i != n)
b = a + (a = b);
return a;
}

进入另一个迭代斐波那契方法,它仍然完全一样,只是新方法只允许包含简单的指令/分配(但在这种情况下也允许使用 while 循环)。

所以我做了这个方法:

  public static long fib2(long n){
        long i = 0;
        long a = 0;
        long b = 1;
        while (i != n){
            long oldA = a;
            a = b;
            b = oldA + a;
            ++i;
        }
        return a;
    }

我现在的问题是:是否可以简化方法并且仍然只保留第一种方法中的所有旧变量(n、i、a、b)还是我必须创建一个新变量(在我的情况下是 oldA ) 所以。因为如果可以只用旧变量来做,那会更好,但我不知道怎么做。

我问这一切是因为在下一步中我需要找到此方法的循环不变量,我认为如果我只有给定的变量而不添加新的变量会更容易。 (我认为不确定)。

提前致谢。

【问题讨论】:

  • 你需要提供一个例子来描述simplify 你的意思。我不认为fib2fib1 更简单。
  • 所以你想要一个除了不像fib1并且不想创建新变量的方法吗?
  • 基本上我认为这意味着应该只允许一行做一件事。 Lke f.ex.增加某事或进行比较等,但不能两者兼而有之
  • @EgZoShift 好的,看我的回答
  • 是的,我看到了,非常感谢。已经有了 b+= a 部分,但之后我不知道如何将 a 设置为正确的值

标签: java loops iteration fibonacci loop-invariant


【解决方案1】:

好的,所以你想保留第一种方法中的所有旧变量(fib1),那么:

  public static long fib3(long n){
        long i = 0;
        long a = 0;
        long b = 1;
        while (i != n){
            b += a;
            a = b - a;//since now b(the variable) is a + b, and a + b - b = a
            i++; 
        }
        return a;
    }

或者在循环中:

  public static long fib3(long n){
        long a = 0;
        long b = 1;
        for(long i = 0;i<n;i++){
            b += a;
            a = b - a;//since now b(the variable) is a + b, and a + b - b = a
        }
        return a;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多