C での順列生成のコードを十進BASICで書いたのですが、再帰関数を呼び出すところでエラーが出ます。
チュートリアルを見ると、十進BASICは再帰をサポートしています。どこがまずいのでしょうか?
DECLARE EXTERNAL FUNCTION Perm
LET N = 5
DIM p(1 TO N)
FOR i = 1 TO N
LET p(i) = i
NEXT i
Perm(1) !ここに書けないというエラーが出る。
END
EXTERNAL FUNCTION Perm(n)
IF i = n THEN
FOR j = i TO n
dmy = p(i)
p(i) = p(j)
p(j) = dmy
NEXT i
Perm(i+1); // 再帰呼び出し
FOR j = i TO n
dmy = p(i)
p(i) = p(j)
p(j) = dmy
NEXT i
ELSE
FOR j = 1 TO N
PRINT USING "#": p(j);
NEXT j
PRINT
END IF
END FUNCTION
-----------------------------------------------------------------
//順列生成(辞書式順列ではない)gcc -o kperm kperm.c
#include <stdio.h>
#define N 5
int p[N+1];
void perm(int);
void main(void)
{
for (int i = 1;i <= N;i++)
p[i] = i;
perm(1);
}
void perm(int i)
{
int j,dmy;
//for debug printf("p[i]=p[%d]=%d\n",i, p[i]);
if (i < N)
{
for (j = i;j <= N; j++) //A-Loop
{
dmy = p[i]; p[i] = p[j]; p[j] = dmy;
perm(i+1); // 再帰呼び出し
dmy = p[i]; p[i] = p[j]; p[j] = dmy;
}
}
else //(i == N)
{
for (j = 1;j <= N;j++) //B-Loop
printf("%d",p[j]);
printf("\n");
}
}
No.2ベストアンサー
- 回答日時:
ちょっと試してみましたが、
Tacosanさん曰く>「関数」だから式の中で呼び出さないといけない
これが原因のような。subにすべきかと。
※ほかのミスについては割愛。
丁寧な回答まことにありがとうございました。何とか動くようになりました。
> ※ほかのミスについては割愛。
読み返したら実にいろいろひどいコードでしたwwww
sub は大昔のBASIC の gosub retuan の名残なのかもしれませんが、関数との違いがよくわかりません。十進BASICではせいぜい50行程度のプログラムしか作らないものですから、関数内やsubプログラム内でグローバル変数が使えない(と思う)のはちょっと痛い。
DECLARE EXTERNAL SUB Perm
LET N = 3
DIM p(N)
FOR i = 1 TO N
LET p(i) = i
NEXT i
CALL Perm(N,1,p)
END
EXTERNAL SUB Perm(N,i,p())
IF i < N THEN
FOR j = i TO N
LET dmy = p(i)
LET p(i) = p(j)
LET p(j) = dmy
CALL Perm(N,i+1,p) ! 再帰呼び出し
LET dmy = p(i)
LET p(i) = p(j)
LET p(j) = dmy
NEXT j
ELSE
FOR j = 1 TO N
PRINT USING "#": p(j);
NEXT j
PRINT
END IF
END sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
if と配列の組み合わせ
-
#define _CRT_SECURE_NO_WARNIN...
-
実数の整数部,小数部の取得
-
C言語 エラーの原因がわからな...
-
数字列を3桁ごとにカンマで区切...
-
異なる文字列のマッチングを、D...
-
C言語での奇数の和
-
複数桁10進数の*桁目だけを抽出...
-
C言語の基礎 . 2乗値の差につ...
-
入力を待たずにstdinの監視をし...
-
比較回数と交換回数表示について
-
c言語 問題
-
c言語の配列を使ってサイコロを...
-
systemの戻り値を取得する方法
-
構造体の勉強中です 合計点の高...
-
アスタリスクでダイヤ型を作る
-
卒業研究でよく分からないとこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報