我正在寫一個函數ChrNumber
將阿拉伯數字字符串轉換爲中文財務數字字符串。我制定了一個樹形遞歸表單。但是當我試圖獲得一個尾遞歸表單時,我很難處理bit
等於6,7或8或10以及更大的情況。如何將此樹遞歸更改爲尾遞歸?
你可以在我的問題結束時看到它是如何工作的。
這是樹狀遞歸解決方案。它的工作原理:
# -*- coding:utf-8 -*-
unitArab=(2,3,4,5,9)
#unitStr=u'十百千萬億' #this is an alternative
unitStr=u'拾佰仟萬億'
unitDic=dict(zip(unitArab,(list(unitStr))))
numArab=list(u'')
#numStr=u'零一二三四五六七八九' #this is an alternative
numStr=u'零壹貳叄肆伍陸柒捌玖'
numDic=dict(zip(numArab,list(numStr)))
def ChnNumber(s):
def wrapper(v):
'this is to adapt the string to a abbreviation'
if u'零零' in v:
return wrapper(v.replace(u'零零',u'零'))
return v[:-1] if v[-1]==u'零' else v
def recur(s,bit):
'receives the number sting and its length'
if bit==1:
return numDic[s]
if s[0]==u'0':
return wrapper(u'%s%s' % (u'零',recur(s[1:],bit-1)))
if bit<6 or bit==9:
return wrapper(u'%s%s%s' % (numDic[s[0]],unitDic[bit],recur(s[1:],bit-1)))
'below is the hard part to be converted to tail-recurion'
if bit<9:
return u'%s%s%s' % (recur(s[:-4],bit-4),u"萬",recur(s[-4:],4))
if bit>9:
return u'%s%s%s' % (recur(s[:-8],bit-8),u"億",recur(s[-8:],8))
return recur(s,len(s))
我嘗試版本僅在recur
功能,我使用了一個封閉res
和移動recur
所以少論據:
res=[]
def recur(s):
bit=len(s)
print s,bit,res
if bit==0:
return ''.join(res)
if bit==1:
res.append(numDic[s])
return recur(s[1:])
if s[0]==u'0':
res.append(u'零')
return recur(s[1:])
if bit<6 or bit==9:
res.append(u'%s%s' %(numDic[s[0]],unitDic[bit]))
return recur(s[1:])
if bit<9:
#...can't work it out
if bit>9:
#...can't work it out
的測試代碼裏面bit
:
for i in range(17):
v1='9'+'0'*(i+1)
v2='9'+'0'*i+'9'
v3='1'*(i+2)
print '%s->%s\n%s->%s\n%s->%s'% (v1,ChnNumber(v1),v2,ChnNumber(v2),v3,ChnNumber(v3))
這應該輸出:
>>>
90->玖拾
99->玖拾玖
11->壹拾壹
900->玖佰
909->玖佰零玖
111->壹佰壹拾壹
9000->玖仟
9009->玖仟零玖
1111->壹仟壹佰壹拾壹
90000->玖萬
90009->玖萬零玖
11111->壹萬壹仟壹佰壹拾壹
900000->玖拾萬
900009->玖拾萬零玖
111111->壹拾壹萬壹仟壹佰壹拾壹
9000000->玖佰萬
9000009->玖佰萬零玖
1111111->壹佰壹拾壹萬壹仟壹佰壹拾壹
90000000->玖仟萬
90000009->玖仟萬零玖
11111111->壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
900000000->玖億
900000009->玖億零玖
111111111->壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
9000000000->玖拾億
9000000009->玖拾億零玖
1111111111->壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
90000000000->玖佰億
90000000009->玖佰億零玖
11111111111->壹佰壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
900000000000->玖仟億
900000000009->玖仟億零玖
111111111111->壹仟壹佰壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
9000000000000->玖萬億
9000000000009->玖萬億零玖
1111111111111->壹萬壹仟壹佰壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
90000000000000->玖拾萬億
90000000000009->玖拾萬億零玖
11111111111111->壹拾壹萬壹仟壹佰壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
900000000000000->玖佰萬億
900000000000009->玖佰萬億零玖
111111111111111->壹佰壹拾壹萬壹仟壹佰壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
9000000000000000->玖仟萬億
9000000000000009->玖仟萬億零玖
1111111111111111->壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
90000000000000000->玖億億
90000000000000009->玖億億零玖
11111111111111111->壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
900000000000000000->玖拾億億
900000000000000009->玖拾億億零玖
111111111111111111->壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹億壹仟壹佰壹拾壹萬壹仟壹佰壹拾壹
請記住臨時蟒蛇不優化尾遞歸。請參閱http://stackoverflow.com/q/13591970/758446 – BlackVegetable
這是否意味着沒有必要將其轉換爲尾遞歸?哦,但我仍然想知道如何解決它。 – tcpiper
那很好。我列出這個評論是爲了給予觀點,而不是作爲解決問題的答案。 – BlackVegetable