セミコロン不要!1からNまでの数字を出力するCプログラムの書き方
本記事では、一風変わったトリッキーな解法を紹介します。それはセミコロンを一切使わずに、1からNまでの数字を出力するC言語プログラムです。
この問題は主に2つのアプローチで解くことができます。1つ目は反復処理(ループ)を使う方法、2つ目は再帰呼び出しを使う方法です。
方法1:while文を使った反復処理
printf()関数は、出力した文字列の長さ(文字数)を戻り値として返します。正常に出力された場合、この値は0以外(真)になります。この性質を利用し、論理AND演算子(&&)と組み合わせることで、条件判定と出力を同時に実行できます。その後、カウンタの値をインクリメントします。
サンプルコード
#include<stdio.h>
#define N 20
int main(int num, char *argv[]) {
while (num <=N && printf("%d ", num) && num++) {
//whileの本体は空
}
}実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
このコードのポイントは、main関数の第1引数numに初期値1(argc)が自動的に渡される点です。条件式では「num <= N」で範囲をチェックし、「printf("%d ", num)」で数字を出力、「num++」でカウンタを増やしています。これらの式がすべて真である限り、空のwhileループが繰り返され、セミコロンなしで目的の出力が得られます。
方法2:再帰呼び出しを使う方法
2つ目の方法では、同じタスクを再帰によって実現します。main関数に引数を渡し、そのmain関数自身を再帰的に呼び出す仕組みです。
サンプルコード
#include<stdio.h>
#define N 20
main(int val) {
if (val <=N && printf("%d ", val) && main(val + 1)) {
//本体は空
}
}実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
こちらのコードでは、if文の条件式の中で再帰呼び出しを行っています。「val <= N」のチェック、printfによる出力の成功、そして「main(val + 1)」の呼び出しが連鎖的に評価されていくことで、1からNまでの数字が順番に出力されます。C言語ではmain関数も引数を受け取れるため、valには初期値1が入り、そこから再帰が始まります。
-
C++で再帰を使わずに二分木のルートからリーフへの経路を出力するプログラム
このチュートリアルでは、与えられた二分木において、ルートノードからすべてのリーフノード(葉ノード)への経路を出力するプログラムを、C++で再帰を使わずに実装する方法を解説します。例として、次のような二分木を考えてみましょう。この二分木には、34・55・29という3つのリーフノードが存在します。したがって、ルートノードからリーフノードへの経路は3つあることになります。アルゴリズムのアプローチこの問題は、再帰に頼らない反復的なアプローチで解くことができます。手順は以下のとおりです。スタックを用いて、二分木を前順走査(先行順走査)します。走査の過程で、各ノードの親ノードへのポインタをマップ(std:
-
再帰を使わずにPythonでネストしたリストをフラット化する方法
再帰処理を使わずにネストされたリストをフラット化(一次元化)したい場合、lambda関数、sum()メソッド、map()メソッド、そしてisinstance()メソッドを組み合わせることで実現できます。 前提知識:使用する機能の概要 Pythonのリストは、整数、浮動小数点数、文字列など、異なるデータ型の値を混在させて格納できる柔軟なデータ構造です。今回のコードを理解するために、使われている各機能を確認しておきましょう。 isinstance()メソッド 指定したオブジェクトが特定のデータ型(クラス)に属しているかどうかを判定する組み込み関数です。このプログラムでは、「対象がリストかどうか」を