ホームページ >バックエンド開発 >C++ >ループや条件文を使わずに 1 から 1000 までの数字を出力するにはどうすればよいでしょうか?

ループや条件文を使わずに 1 から 1000 までの数字を出力するにはどうすればよいでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-25 06:53:12837ブラウズ

How Can You Print Numbers 1 to 1000 Without Loops or Conditional Statements?

ループや条件なしで 1 から 1000 までの数値を出力する

プログラマーに課せられた課題は、何も使用せずに 1 から 1000 までの数値を出力することです。ループ構造または条件文。このタスクには、数値の範囲を反復処理する一般的な方法を回避する創造的なアプローチが必要です。

C または C の 1 つの解決策は、関数呼び出しの再帰的な性質を利用します。次のコードは、ループと条件文をバイパスします。

#include <stdio.h>
#include <stdlib.h>

void main(int j) {
  printf("%d\n", j);
  (&&main + (&exit - &main)*(j/1000))(j+1);
}

ここでの魔法は、関数ポインターの使用にあります。 &main 式は main 関数のアドレスを表し、&exit - &main はメモリ内の関数のサイズを計算します。 (j/1000) にこの値を乗算すると、関数はそれ自体を再帰的に呼び出し、メモリ内のその位置を適切な量だけシフトします。これにより、明示的なループ機構を使わずに j を 1 ずつインクリメントし、印刷プロセスを続行することができます。

元のコードにはポインター演算の問題があるため、標準 C での改良版が以下に提供されています。

#include <stdio.h>
#include <stdlib.h>

void f(int j)
{
    static void (*const ft[2])(int) = { f, exit };

    printf("%d\n", j);
    ft[j/1000](j + 1);
}

int main(int argc, char *argv[])
{
    f(1);
}

このバージョンでは、ポインター算術の問題を回避するために関数ポインターの静的配列が利用されます。 main 関数は、2 つの要素で配列を初期化します。再帰を継続するための f 自体と、最後の j 値に達したときに終了し、プロセスの終了を通知します。

以上がループや条件文を使わずに 1 から 1000 までの数字を出力するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。