質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

252閲覧

並び変えの問題を総当たり表示 再帰で

Ritsu

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/09/28 03:08

編集2018/09/28 03:17

前提・実現したいこと

C言語で再帰の勉強をしています。初心者です。
入力されたLとRの個数(L+R<=8)で考えられるLとRの並び順を再帰ですべて表示したいのですが
全く方法が思いつきません。
アドバイスいただけると幸いです。

<入力例>
L:3
R:2

<出力例>
LLLRR
LLRLR
LLRRL
LRRLL
LRLRL
LRLLR
RRLLL
RLRLL
RLLRL
RLLLR

発生している問題・エラーメッセージ

該当のソースコード

試したこと

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dice142

2018/09/28 03:13

記載された説明だけではどういう入力でどういう出力が得られれば期待通りなのかわかりません。入力例出力例もご提示ください。
Ritsu

2018/09/28 03:19

ご指摘ありがとうございます
guest

回答2

0

Cなど不要。そう、シェル芸ならね!

bash

1$ f(){ if [[ $1 == 0 && $2 == 0 ]];then echo $3;else [[ $1 > 0 ]]&&f $(($1 -1)) $2 ${3}L;[[ $2 > 0 ]]&&f $1 $(($2 -1)) ${3}R;fi };f 3 2 2LLLRR 3LLRLR 4LLRRL 5LRLLR 6LRLRL 7LRRLL 8RLLLR 9RLLRL 10RLRLL 11RRLLL

投稿2018/09/28 10:12

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ベースとなる考え方

順列を木で表現して、再帰関数で巡回します。
今回は LR の2文字なので、2分木と考えることができます。

3文字の例
イメージ説明

文字数が木の深さになります。

c

1#include <stdio.h> 2 3/** 4 @brief func 順列を生成する再帰関数 5 @param depth ノードの深さ 6 @param str 文字列を格納する変数 7 */ 8void func(int depth, char str[]) 9{ 10 if (depth == 8) { // leaf ノード 11 printf("%s\n", str); // 文字列を表示する。 12 return; 13 } 14 15 str[depth] = 'L'; 16 func(depth + 1, str); 17 18 str[depth] = 'R'; 19 func(depth + 1, str); 20} 21 22 23int main() 24{ 25 char str[9] = {}; // str[8] は \0 終端用 26 func(0, str); 27}

制約付きの順列

木の生成に関して、L 及び R の個数に制約をつけます。

c

1#include <stdio.h> 2 3/** 4 @brief func 順列を生成する再帰関数 5 @param depth ノードの深さ 6 @param str 文字列を格納する変数 7 @param l_cnt L の残り個数 8 @param r_cnt R の残り個数 9 */ 10void func(int depth, char str[], int l_cnt, int r_cnt) 11{ 12 if (l_cnt == 0 && r_cnt == 0) { 13 // L と R が残っていない場合 14 printf("%s\n", str); 15 return; // leaf ノード 16 } 17 18 if (l_cnt > 0) { 19 // L がまだ残っている場合 20 str[depth] = 'L'; 21 func(depth + 1, str, l_cnt - 1, r_cnt); 22 } 23 24 if (r_cnt > 0) { 25 // R がまだ残っている場合 26 str[depth] = 'R'; 27 func(depth + 1, str, l_cnt, r_cnt - 1); 28 } 29} 30 31int main() 32{ 33 char str[9] = {}; // str[8] は \0 終端用 34 int l_cnt = 3; 35 int r_cnt = 2; 36 func(0, str, l_cnt, r_cnt); 37}

output

1LLLRR 2LLRLR 3LLRRL 4LRLLR 5LRLRL 6LRRLL 7RLLLR 8RLLRL 9RLRLL 10RRLLL

投稿2018/09/28 03:45

編集2018/09/28 03:55
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ritsu

2018/09/29 04:52

回答ありがとうございます。 図解もあって非常にわかりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問