考拉茲猜想(Collatz conjecture)--while/if用法以及用戶自定義函數(shù)
? ? ? Lothar Collatz 在 1930 年代提出,是指對(duì)于每一個(gè)正整數(shù),如果它是奇數(shù),則對(duì)它乘 3 再加 1,如果它是偶數(shù),則對(duì)它除以 2,如此循環(huán),最終都能夠得到 1。通過前面對(duì)數(shù)列求解的認(rèn)識(shí),我們可以類似的編寫程序。這里判斷奇數(shù)/偶數(shù)可以用求余函數(shù)mod,判斷可以用if語句,循環(huán)終止是數(shù)列的某項(xiàng)達(dá)到1,可以用while語句。

? ? ? ?上面給出的程序范例供參考。這里假定我們選擇28這個(gè)正整數(shù)(詳見左圖),然后把每一步的操作結(jié)果依次記錄到數(shù)列a中,初始條件就是a(1)=28,其中i是當(dāng)前數(shù)列的長度。我們先用while語句判斷數(shù)列是否達(dá)到了1,如果不等于1,進(jìn)入循環(huán),按照奇數(shù)和偶數(shù)分類,用if/else來實(shí)現(xiàn)。此時(shí)數(shù)列比原來多了一位,更新i=i+1。從畫圖或者查看工作區(qū)變量都可以看到,a(1)=28時(shí),a(19)=1,程序正常退出。如果擔(dān)心一直不收斂,可以在while后面加上&&i<100就可以讓程序在第100步停止。為了方便使用,我們可以建立自定義函數(shù),名字為Collatzfun.m,注意第1行的格式(詳見右圖),這里N是輸入?yún)?shù),可以在命令窗口輸入Collatzfun(28)回車,就可以得到相同的效果。
? ? ? ? 如果我們想看一下,不同的正整數(shù)最終達(dá)到1需要的步數(shù),可以再寫一個(gè)m文件來調(diào)用。

? ? ? ?比如我們要看從2到100時(shí)的結(jié)果,先初始化y=2:100,這里我們需要根據(jù)y的數(shù)組元素個(gè)數(shù)來做循環(huán),length(y)就是返回元素個(gè)數(shù)。對(duì)于y的每個(gè)元素y(i),調(diào)用Collatzfun得到收斂的數(shù)組tp,我們關(guān)心是經(jīng)過多少步收斂,再用length返回tp的數(shù)組元素個(gè)數(shù)即可,保存在num變量的對(duì)應(yīng)分量中。如右上圖所示,多數(shù)整數(shù)都在40步以內(nèi)收斂到1,有些則需要超過100步。
? ? ? ?結(jié)合自定義函數(shù),我們可以對(duì)不少有趣的數(shù)論猜想進(jìn)行簡(jiǎn)單的測(cè)試。對(duì)于考拉茲猜想,網(wǎng)上的消息是:大多數(shù)數(shù)學(xué)家都認(rèn)為這是正確的,可以通過計(jì)算機(jī)來檢測(cè)非常龐大的數(shù)字,就目前結(jié)果來看還沒發(fā)現(xiàn)任何反例。