【C言語】ループ・再帰・マクロ展開なしで数値を100回出力する方法
本記事では、C言語で数値を100回出力する方法を解説します。ただし、ここにはいくつかの制約があります。ループ文、再帰呼び出し、マクロ展開は一切使用できないという条件です。
解決策:setjmp() と longjmp() を活用する
この制約をクリアするために利用するのが、setjmp.h ヘッダーで提供されている setjmp() 関数と longjmp() 関数です。
setjmp() は、呼び出された時点のプログラムの状態(ジャンプ位置)を jmp_buf 型のバッファに保存します。一方、longjmp() は、その保存された位置へプログラムの制御を戻す役割を持ちます。この2つの関数を組み合わせることで、ループ構文を使わずに繰り返し処理を実現できるのです。
サンプルコード
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
main() {
int x = 1;
setjmp(buf); // buf を使ってジャンプ位置を設定
printf("5"); // 数値を出力
x++;
if (x <= 100)
longjmp(buf, 1); // setjmp で記録された位置へジャンプ
}
実行結果
5555555555555555555555555555555555555555555555555555555555555555555555555555 555555555555555555555555
コードの仕組み
処理の流れは以下のとおりです。
- 変数
xを 1 で初期化し、setjmp(buf)でジャンプ位置を記録します。 printf()で数値「5」を出力し、xをインクリメントします。xがまだ 100 以下であれば、longjmp(buf, 1)によってsetjmp()の位置へ制御が戻ります。- 以降は通常のループと同じように、条件を満たす限り出力とカウントアップが繰り返されます。
このように setjmp() / longjmp() を使えば、ループや再帰に頼らずに繰り返し処理を記述できます。なお、これらの関数は本来エラー処理などの用途で使用されるものなので、実際の開発では可読性や保守性への影響を考慮したうえで慎重に使いましょう。
-
【Python】ループを使わずに数列を出力する方法:再帰呼び出しを活用した実装
はじめに 本記事では、以下の問題に対する解決策について詳しく解説します。 問題の概要 2つの整数 N と K が与えられたとき、N が 0 より大きい間は N から K を引き続けます。そして N が 0 以下になったら、今度は元の値 N に戻るまで K を足していきます。 入力例 N = 10 K = 4 出力例 10 6 2 -2 2 6 10 アルゴリズムの考え方 N が 0 より大きい間、関数を再帰的に呼び出し続けます(各呼び出しごとに N から K を減算します)。 数値が 0 以下になったら、元の値に戻るまで各呼び出しごとに K を加算します。 加算と減算は同じ1つの関数
-
ループを使わずに数列を出力するPythonプログラム|再帰とフラグで実現する方法
本記事では、for文やwhile文などのループ構文を一切使わずに数列を表示するという問題の解法について解説します。問題の定義問題: 2つの数値 N と K が与えられます。まずNが0より大きい間はNからKを繰り返し引き、Nが0以下(ゼロまたは負)になったら、今度は逆にKを足していきます。そして値が元の数値Nに戻った時点で処理を終了します。実行例N = 10K = 4出力: 10 6 2 -2 2 6 10アルゴリズムNが0より大きい間、関数を再帰的に呼び出し続けます。各呼び出しのたびにNからKを減算します。数値が0以下になったら加算モードに切り替え、各呼び出しごとにKを加算します。元の数値Nに