編程與邏輯思維
隨著時代的進步,越來越多的工作是在電腦上面進行,如果具備一定的編程技能,則很多工作可以高效的完成,而不是手動一點點的處理,即便為了早點下班陪家人,程序員之外的崗位也得學一點編程,但是單純跟著視頻或教材學一下編程軟體,是無法真正學會編程的,只要現實問題和書上案例有不一致的地方,新手就會遇到各種困難無從下手,要真正的解決實際問題,除了軟體技能,還需要邏輯思維。
比如網上一個題目,對1-100的數字做輸出,但對3的整數倍輸出fizz,對5的整數倍輸出buzz,又是3又是5的整數倍輸出fizzbuzz,如果用下列的循環和條件語句,先構建數組,再替換指定數,是不行的,程序會先把所有3的倍數替換掉,然後不執行其他,因為總是先執行第一個條件,而當第一個條件不滿足時,後面的更無法滿足(i*3都超出範圍了,i*5更是無法落在範圍內),導致後面的條件不會被真正執行,
input=[]
for i in range(100):
input.append(i+1)
for i in range(100):
i=i+1
if i*3 <= 99:
input[i*3-1]=fizz
elif i*5 <=99:
input[i*5-1]=buzz
elif i*3*5 <=99:
input[i*3*5-1]=fizzbuzz
else:
input[i-1]=input[i-1]
print(input)
如果執行下列程序,則除了3的倍數被執行,5的部分也會被執行,因為結構從串列的if-else換成並行的多個if,但是這時3*5的部分依然不會被執行,因為第一個部分的步長3比第三個的步長15更短,隨著i的增加,第一個新增的部分會把第三個前面已經更新成fizzbuzz的再次更新為fizz,
input=[]
for i in range(100):
input.append(i+1)
for i in range(100):
i=i+1
if i*3 <= 99:
input[i*3-1]=fizz
if i*5 <=99:
input[i*5-1]=buzz
if i*3*5 <=99:
input[i*3*5-1]=fizzbuzz
print(input)
改為下列形式,才可以得到想要的結果,
input=[]
for i in range(100):
input.append(i+1)
for i in range(100):
i=i+1
if i*3 <= 99:
input[i*3-1]=fizz
for i in range(100):
i=i+1
if i*5 <=99:
input[i*5-1]=buzz
for i in range(100):
i=i+1
if i*3*5 <=99:
input[i*3*5-1]=fizzbuzz
print(input)
如果使用一點點具體軟體的技巧,比如python的求余功能%,也能直接生成想要的數組,而不用替換,注意此時依然要避免3的部分把3*5的部分覆蓋掉,所以要把3*5的部分放到串列判斷的最前面,
input=[]
for i in range(100):
i=i+1
if i%(3*5) == 0:
input.append(fizzbuzz)
elif i%5 == 0:
input.append(buzz)
elif i%3 == 0:
input.append(fizz)
else:
input.append(i)
print(input)
我們再做一個例題,對指定數組中連續且相等的元素合併為一減少重複,可使用下列程序,這裡容易犯的一個錯誤是直接按list2清理list1,但是清理過程中list1的元素位置是會變動的,所以要先倒轉list2再從後到前的清理,
list1=[1,1,3,4,4,1]
list2=[]
for i,data in enumerate(list1):
if i >0:
if list1[i-1]==list1[i]:
list2.append(i)
list2.reverse()
for del2 in list2:
del list1[del2]
print(list1)
要鍛煉邏輯思維,最好的辦法是認真多讀數學相關書籍,或者在長期的編程工作中一個個坑的趟過去,趟的坑多了,就精明了。簡單的學個軟體,或者上個培訓班,是無法真正形成邏輯思維的。
推薦閱讀:
※從零開始手敲次世代遊戲引擎(DX12特別篇)
※GacUI 動畫系統 (1)
※現在學編程,晚么?
※楚河漢界
※分治法,動態規劃及貪心演算法區別
TAG:編程 |