(原創) 如何印出1 2 3....10 9 8...1? (C/C++) (C)
這是我同學問我的題目,我想來想去只能寫出以下三種寫法,若有更好的寫法,請告訴我。
使用Recursive
1/*
2(C) OOMusou 2006 http://oomusou.cnblogs.com
3
4Filename : UpDown_Recursive.cpp
5Compiler : Visual C++ 8.0 / ISO C++
6Description : Demo how to use print up and down.
7Release : 01/14/2007 1.0
8*/
9#include "stdio.h"
10
11void upDown(int , int);
12
13int main() {
14 upDown(0, 10);
15}
16
17// n : initial value, upper : upper bound
18void upDown(int n, int upper) {
19 printf("%d ",n);
20
21 if (n < upper)
22 n+1 != upper ? upDown(n+1, upper) : printf("%d ",upper);
23
24 printf("%d ",n);
25}
2(C) OOMusou 2006 http://oomusou.cnblogs.com
3
4Filename : UpDown_Recursive.cpp
5Compiler : Visual C++ 8.0 / ISO C++
6Description : Demo how to use print up and down.
7Release : 01/14/2007 1.0
8*/
9#include "stdio.h"
10
11void upDown(int , int);
12
13int main() {
14 upDown(0, 10);
15}
16
17// n : initial value, upper : upper bound
18void upDown(int n, int upper) {
19 printf("%d ",n);
20
21 if (n < upper)
22 n+1 != upper ? upDown(n+1, upper) : printf("%d ",upper);
23
24 printf("%d ",n);
25}
使用while loop
1/*
2(C) OOMusou 2006 http://oomusou.cnblogs.com
3
4Filename : UpDown_while.cpp
5Compiler : Visual C++ 8.0 / ISO C++
6Description : Demo how to use print up and down.
7Release : 01/14/2007 1.0
8*/
9
10#include "stdio.h"
11
12int main() {
13 // n : initail value, upper : upper bound, dir : direction
14 int n = 0, upper = 10, dir = 1;
15
16 do {
17 printf("%d ",n);
18
19 dir ? ++n : --n;
20 n == upper ? dir = 0 : 1;
21
22 } while(n+1);
23}
2(C) OOMusou 2006 http://oomusou.cnblogs.com
3
4Filename : UpDown_while.cpp
5Compiler : Visual C++ 8.0 / ISO C++
6Description : Demo how to use print up and down.
7Release : 01/14/2007 1.0
8*/
9
10#include "stdio.h"
11
12int main() {
13 // n : initail value, upper : upper bound, dir : direction
14 int n = 0, upper = 10, dir = 1;
15
16 do {
17 printf("%d ",n);
18
19 dir ? ++n : --n;
20 n == upper ? dir = 0 : 1;
21
22 } while(n+1);
23}
執行結果
0 1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 0 請按任意鍵繼續 . . .
Recursive效率不好,所以就不談了,若用while()寫,目前看起來還須多動用到一個變數指定方向,有沒有辦法省掉一個變數呢?我本來也以為這應該是最簡單的寫法了,但後來靈機一動,想到目前用到的都是程式的解法,若用數學來解呢?可否想辦法找出一個公式呢?
以下是用數學的方式來解:
1/*
2(C) OOMusou 2006 http://oomusou.cnblogs.com
3
4Filename : UpDown_Math.cpp
5Compiler : Visual C++ 8.0 / ISO C++
6Description : Demo how to use print up and down.
7Release : 01/14/2007 1.0
8*/
9#include "stdio.h"
10
11int main() {
12 // n : initail value, upper : upper bound
13 int n = 0, upper = 10;
14
15 do {
16 printf("%d ", n <= upper ? n++ : 2 * upper -n++);
17 } while(n <= 2 * upper);
18}
2(C) OOMusou 2006 http://oomusou.cnblogs.com
3
4Filename : UpDown_Math.cpp
5Compiler : Visual C++ 8.0 / ISO C++
6Description : Demo how to use print up and down.
7Release : 01/14/2007 1.0
8*/
9#include "stdio.h"
10
11int main() {
12 // n : initail value, upper : upper bound
13 int n = 0, upper = 10;
14
15 do {
16 printf("%d ", n <= upper ? n++ : 2 * upper -n++);
17 } while(n <= 2 * upper);
18}
我用以下的方式歸納出一個公式
0 1 2 3 2 1 0
0 1 2 3 4 5 6
n=0 n
n=1 n
n=2 n
n=3 n
n=4 upper -1 = upper - (n-upper) = 2 * upper -n
n=5 upper -2 = upper - (n-upper) = 2 * upper -n
n=6 upper -3 = upper - (n-upper) = 2 * upper - n
s = n if n <= upper
s = 2 * upper -n otherwise
這樣子就可不需另外一個變數,且一層while()就可解決了。
這個例子告訴我們,要對程式最佳化,數學仍是最終極的武器,所以師長們說的很對,程式要寫的好,數學一定要好,我要好好的學數學了。