📜  Zeckendorf 定理的Java程序(非相邻斐波那契表示)(1)

📅  最后修改于: 2023-12-03 15:35:49.604000             🧑  作者: Mango

Zeckendorf的定理

Zeckendorf的定理是一种将正整数表示为斐波那契数字序列之和的方法。斐波那契数字序列定义为F0=0,F1=1,并且对于所有n≥2,Fn=Fn−1+Fn−2。斐波那契数字序列的前几个数字为0、1、1、2、3、5、8、13、21、34等等。

根据Zeckendorf的定理,正整数n可以表示为∑i=1kFi,其中Fi为斐波那契数字序列中的第i个数字,且相邻的数字不能同时使用。例如,17可以表示为13+3+1,而不能表示为8+8+1或5+5+5+2。

Java程序实现

下面是一个Java程序实现Zeckendorf的定理,实现了一个可以表示任何正整数的非相邻斐波那契表示。

import java.util.ArrayList;

public class Zeckendorf {

    public static ArrayList<Integer> zeckendorf(int n) {

        ArrayList<Integer> fibList = new ArrayList<Integer>();

        fibList.add(0, 1);
        fibList.add(1, 1);

        while (true) {
            int nextFib = fibList.get(fibList.size() - 1) + fibList.get(fibList.size() - 2);
            if (nextFib <= n) {
                fibList.add(nextFib);
            } else {
                break;
            }
        }

        ArrayList<Integer> result = new ArrayList<Integer>();

        for (int i = fibList.size() - 1; i >= 0; i--) {
            if (n >= fibList.get(i)) {
                n -= fibList.get(i);
                result.add(fibList.get(i));
            }
        }

        return result;

    }

    public static void main(String[] args) {

        int n = 17;
        ArrayList<Integer> nonAdjacentFibonacci = zeckendorf(n);
        System.out.println(nonAdjacentFibonacci);

    }

}

上面的程序会输出一个数组,其内容表示非相邻斐波那契表示,例如对于n=17,输出结果为[13, 3, 1]。

虽然这个程序相对简单,但它利用了斐波那契数字序列的特殊性质,实现了一个实用的算法。