比較兩個連分數的大小

# -*- coding: utf-8 -*-
# @Time         : 2019-09-17 12:08
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : continued_fraction.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

"""
(1)連分數比大小

連分數能夠表示爲(a0;a1,a2,……,an),這樣直觀的數學表示爲:

輸入

n,以後是n+1個數字,分別表示a0,a1,……,an

m,以後是m+1個數字,分別表示b0,b1,……,bn

要求比較以上兩個連分數(分別記爲x和y)的大小,n和m不超過100000

輸出

若x>y,輸出「>」,若x<y,輸出「<」,不然輸出「=」
"""

def compareContinuedFraction():
    """
    從下標爲0開始一直到下標爲n,逐個比對a[i]和b[i]的大小。
    當有一個數組比對到了最後一個元素以後,若是該下標的a[i]和b[i]同樣大,因爲有一個數組已經沒有待
    比對的元素了,所以那個較短的數組在該下標 判斷爲 小於 較長的數組。

    **關鍵在於**,在某一個下標判斷出了大小以後,須要從該下標往回比較,因爲是在分母位置,所以往回
    傳遞大小的時候與當前位置的大小相反。
    4 1 2 3 4        4 1 2 3 4
    0 0 0 0 +   ->   + - + - +
    4 1 2 3 3        4 1 2 3 3

    上面的+表明1,-表明-1,0表明0
    當比對到任意一個數組的末尾或者比對出了大小關係以後,往回傳遞,這時候傳遞的結果是大小交替的
    所以,在上面的例子中,比對到最後一個元素的時候是+,而後開始往回傳遞(遞歸中的歸),最後到達
    下標爲0的位置的時候的大小結果就是最終的大小結果。
    :return:
    """
    def helper(idx):
        # 這裏只是單純的比較對應下標的元素的大小
        if a[idx] > b[idx]:
            return 1
        if a[idx] < b[idx]:
            return -1
        # 若是同時到達數組末尾,那麼說明這兩個連分數大小同樣
        if idx == n == m:
            return 0
        # 若是a比較短,那麼b後面剩下的元素都不用比了,在這一個下標判a[i] < b[i]
        if idx == n:
            return -1
        # 反之亦然
        if idx == m:
            return 1
        # 若是在數組的開頭沒有比較出大小,那麼就日後逐個比對
        k = helper(idx + 1)
        # 當後面的比對得出結果以後,往回傳遞,這時候注意將大小對調
        if k > 0:
            return -1
        if k < 0:
            return 1
        return 0

    # 在初始化變量的時候,*a能夠做爲一個列表變量
    n, *a = list(map(int, input().split(' ')))
    m, *b = list(map(int, input().split(' ')))

    res = helper(0)
    print({0: '=', 1: '>', -1: '<'}[res])

compareContinuedFraction()
相關文章
相關標籤/搜索