【问题标题】:Hofstadters Q Sequence霍夫施塔特的 Q 序列
【发布时间】:2014-11-18 11:21:46
【问题描述】:

我已经盯着这个差不多一个星期了,不知道如何实现java代码。 首先,我写了一个递归 Hofstadters Q 序列,它计算 Hofstadter 的 Q 序列中的第 n(th) 个数,对于 n ≥ 1,如下所示 附言。 Hofstadters Q 数列有点像斐波那契数列,只是它的定义如下:

Q(1) = 1, Q(2) = 1, and
Q(n) = Q(n − Q(n − 1)) + Q(n − Q(n − 2)), for n > 2

public static int Hofstadters(int n)
  {
    int result;

    if (n < 3)
      result = 1;
    else
      result = Hofstadters(n - (Hofstadters(n-1))) + Hofstadters(n - (Hofstadters(n-2)));
    return result;
  }

这工作得很好。现在我面临的挑战是使用循环而不是递归和数组来编写这段代码(在我计算从 Q(1) 到 Q(n) 的序列中存储数字)。

我的想法是我将 Q(i) 元素放入数组的位置 i,从 1 到 n。

我什至不知道如何开始。到目前为止,我只写了下面的代码,并且从那以后几乎一直盯着我的屏幕:

public static void QSequence(int n)
  {
    int result;
    int [] arr;
    int value;

    arr = new int [n-1];
    arr[0] = 1;
    arr[1] = 1;

    for(int count = 2; count< arr.length; count++)
    {
      //code
    }
  }

任何帮助和提示将不胜感激,谢谢

【问题讨论】:

    标签: java loops recursion iteration sequences


    【解决方案1】:

    它应该可以工作:

    package snippet;
    
    public class Snippet {
    
        public static void main(String[] args) {
            System.out.println(QSequence(10));
        }
    
        public static int QSequence(int n) {
            int result;
            int[] arr;
            int value;
    
            arr = new int[n];
            arr[0] = 1;
            arr[1] = 1;
    
            for (int i = 2; i < arr.length; i++) {
                arr[i] = arr[i - arr[i - 1]] + arr[i - arr[i - 2]];
            }
    
            return arr[n - 1];
        }
    }
    

    【讨论】:

    • 哇,它完美运行!你能解释一下这是如何工作的吗? arr[i] = arr[i - arr[i - 1]] + arr[i - arr[i - 2]];
    • arr[i - arr[i - 1]] = arr[1 - arr[1 - 1]] = arr[1 - arr[0]] = arr[1 - 1]],因为 arr[0] = 1,并且 arr[1 - 1] = arr[0] = 1。这个解释有帮助吗?
    猜你喜欢
    • 2014-04-29
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多