第十題
3-9難度系數1 列印菱形圖案 (5分)

這道題完美的詮釋了什么叫格式
先來觀察輸出的格式

這里是輸入7,輸出這個菱形
菱形的上下對稱
每一行的 “*” 數量均為奇數
很自然我們想到遞回

這里簡單解釋一下遞回
將一個運用遞回的函式f(x),根據再次呼叫f(x)的陳述句,分為上下兩部分,如圖

比如這個函式f(x)
void f(int x){
cout << x << endl;
if(x != 1){
f(x - 1);
cout << x << endl;
}
}
當輸入x = 4,呼叫f時
//遞 部分
f(4)//第一次呼叫
cout << 4 << endl;
f(4 - 1)//第二次呼叫
cout << 3 << endl;
f(3 - 1)//第三次呼叫
cout << 2 << endl;
f(2 - 1)//第四次呼叫
cout << 1 << endl;
//此時x = 1,if條件判斷不成立,故遞回終止
//歸 部分
cout << 2 << endl;//第三次呼叫的函式還沒執行結束
cout << 3 << endl;//第二次呼叫的函式還沒執行結束
cout << 4 << endl;//第一次呼叫的函式還沒執行結束
最后輸出結果是:
4
3
2
1
2
3
4
參考文章對于遞回有沒有什么好的理解方法?
有興趣的同學可以實驗一下,將上述f(x)中的if陳述句中的cout << x << endl;放在if陳述句之外會發生什么?
先處理“*”部分
void f(int a, int b){
//變數a是總行數,作用是規定 遞 的次數,變數b初始值為1,作用的是規定一行輸出多少個“ * ”
for(int i = 1;i <= b;++i) cout << "*" << " ";//遞 部分
cout << endl;
if(a != 1){
f(a - 2,b + 2);
for(int i = 1;i <= b;++i) cout << "*" << " ";//歸 部分
cout << endl;
}
}
呼叫f(7,1)輸出結果為
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
有內味了
接下來看空格

空格的規律是:6,4,2,0,2,4,6
再看看a的變化規律:7,5,3,1,3,5,7
b變化規律:1,3,5,7,5,3,1
發現,空格數量就是a - 1
運用printf格式輸出
printf("%*s",a - 1,"");
看不懂的看這里
printf(%*.*f,m,n,f)
printf “%.*s”
當然也可以使用for來輸出空格
for(int i = 1;i <= a - 1;++i) cout << " ";
再加上輸入陳述句
這題就解完了
完整代碼如下
#include<iostream>
#include<stdio.h>
using namespace std;
void f(int a, int b){
printf("%*s",a - 1,"");
for(int i = 1;i <= b;++i) cout << "*" << " ";
cout << endl;
if(a != 1){
f(a - 2,b + 2);
printf("%*s",a - 1,"");
for(int i = 1;i <= b;++i) cout << "*" << " ";
cout << endl;
}
}
int main(){
int inp;
cin >> inp;
f(inp,1);
}
提交結果如下

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/205944.html
標籤:其他
上一篇:這是標題框嗎?我試一下
