比較兩個連分數的大小

# -*- 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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章