アプリ版:「スタンプのみでお礼する」機能のリリースについて

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");
  }
}

A 回答 (2件)

単純に


「関数」だから式の中で呼び出さないといけない
というオチだったりして.

知らんけど.
    • good
    • 0
この回答へのお礼

結局そういうオチでした(笑)
ありがとうございました。

お礼日時:2022/11/19 08:47

ちょっと試してみましたが、


Tacosanさん曰く>「関数」だから式の中で呼び出さないといけない
これが原因のような。subにすべきかと。
※ほかのミスについては割愛。
    • good
    • 0
この回答へのお礼

丁寧な回答まことにありがとうございました。何とか動くようになりました。
> ※ほかのミスについては割愛。
 読み返したら実にいろいろひどいコードでした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

お礼日時:2022/11/19 08:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!