iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0
自我挑戰組

JS 基礎學習及解題訓練系列 第 2

基本JavaScript 迴圈(Loop) - 如何用迴圈製作*字金字塔?(應用解題2)

  • 分享至 

  • xImage
  •  

第二題:*字金字塔

這次的米字金字塔比上一題的直角三角形難一點,因為必須考慮到米字與空格的位置,話不多說,直接來解題吧!
https://ithelp.ithome.com.tw/upload/images/20220902/201457464iUjk2ldbe.png
首先寫Code前,我們來講一下解題思路,
如上圖,我們需要讓每一層的米字都遞增兩個,而空白每層要左右各遞減一個,那這樣要怎麼寫呢?
答案:

function triStr(n){
  let starStr = "*";
  let levelStr = "";
  let everyStr = "";
  for(let k=0; k<n ; k++){
    let spaStrLeft = "";
      for(let y=n-1; k<y; y--){
      spaStrLeft += " ";
    }
    for(let i=2; i<=2*k+1; i++){
      starStr += "**";
      break;
    }
    levelStr = spaStrLeft + starStr + spaStrLeft + '\n';
    everyStr += levelStr;
  }
  return everyStr;
}
console.log(triStr(5));

如上面的程式碼,可以看到我先設定三個參數,
第一個參數是米字,我假設一開始我就有一個米字
第二個參數是每一層我要塞什麼給他,我預設是空的
第三個參數是每層最後的結果,預設也是空的

再來我們用三個for迴圈來控制:
1.第一個for迴圈控制我們總共要跑幾次,從幾開始跑
我給這層的參數是k,總層數是n,k小於n,且從0開始遞增
2.第二個for迴圈是空白
預設空白參數是spaStrLeft = "",這層的參數是y
那y為什麼從n-1開始呢?因為最後一層是沒有空白的,所以要減掉
再看為什麼這邊條件是k<y呢?因為我們要做遞減,也就是說如果我的k參數小於y的話,我們要遞減的意思
3.第三個for迴圈是米字
我給這層的參數是i,那為什麼米字從2開始才跑下面的程式碼呢?
我下面設定每層加兩個*,如果我從1開始跑的話,就會變成第一層開始加兩個米字,這樣就不是我要的金字塔拉~
https://ithelp.ithome.com.tw/upload/images/20220902/20145746tEsNk43vlF.png
i<=2*k+1又是什麼意思呢?
當我的i 小於等於2倍的k再加1時,要跑下面的程式碼的意思,是不是不太懂,我們畫個圖
https://ithelp.ithome.com.tw/upload/images/20220902/20145746QbleGeKsAi.png
最後每跑一次記得要讓他break;,強制退出這個循環,不然他會一直往後接,如下圖
https://ithelp.ithome.com.tw/upload/images/20220902/20145746gpOv1G6bPR.png

最後把所有結果組合起來:
levelStr = spaStrLeft + starStr + spaStrLeft + '\n';
每層 = 空格 + 米字 + 空格 + 換行
再把levelStr的值加到everyStr上
最後回傳(return)到everyStr上就完成囉!
因為篇幅的關係,另一種解法,我就放到下一篇講解囉!


上一篇
基本JavaScript 迴圈(Loop) - 如何用迴圈製作*字三角形?(應用解題)
下一篇
基本JavaScript 迴圈(Loop) - 如何用迴圈製作*字金字塔?(應用解題3)
系列文
JS 基礎學習及解題訓練9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言