• ベストアンサー

左再帰について

次のBNFが左再帰であるかないかを判定し、その根拠を説明せよ。 <A> ::=<B>|<C>|<C> <B> ::=if<C>then<A> <C> ::=a|b|c <D> ::=<A>while<C> これを簡単でいいので教えてください。 できれば左再帰とは何かも教えてください。

noname#50160
noname#50160

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>これを簡単でいいので教えてください。 >できれば左再帰とは何かも教えてください。 後半だけ。 左再帰というのは、構文定義において 左辺にある非終端記号が右辺の最初の項目に現れるってことです。 #思いっきりざっくり。 たとえば「足し算」という構文を考えたときに <式> ::= <式> + <数> | <数> <数> ::= 0|1|2|3|4|5|6|7|8|9 みたいなのがわかりやすい例。 で、左再帰には直接左再帰と間接左再帰があって 上の例は直接左再帰。 間接左再帰はいくつかの規則を辿った末に 再帰が出てくるというもの。 ということで >次のBNFが左再帰であるかないかを判定し、その根拠を説明せよ。 脳みそ絞って頑張れ :) http://nicosia.is.s.u-tokyo.ac.jp/pub/staff/hagiya/kougiroku/compiler/ll Bison 1.28 - 用語集 http://lmj.nagaokaut.ac.jp/gnu_manual/bison-1.28/bison-ja_14.html

関連するQ&A

  • VBA if文の作法

    if a=1 then b=1 end if を if a=1 then b=1 と書けますよね。 しかし、以下のような書き方だとa=1がFALSEでもその次のif b=1 then c=1の判定をしに行きます。なぜこの書き方がいけないのでしょうか? if a=1 then if b=1 then c=1 end if

  • c言語の再帰について教えてください。

    c言語を勉強してるんですが、再帰のイメージがなかなかつかめません。 例えば、入力した文字列を逆から一文字ずつ表示させるのには どうしたらいいのか教えてください! 入力:ABCDE E D C B A ソースで処理される順序など説明等していただけたらうれしいです。

  • 再帰の問題です。

    AOJの問題で、C言語で書いています。 ある解答者様のコードが自分の理解に深まると思い、見ているのですが、解答者様の作った関数のところの動作がよくわかりません。 問題です。 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0030&lang=jp 解答例です。分かるところ、分からないところを書いていきます。 #include<stdio.h> int n,s,a;//グローバル変数。 void dfs(int i,int sum,int m){//ここでいう、i,sum,mが何を指しているのか分かりません。 if(m==0 && sum==s){a++;return;} if(i==10 || m==0)return; dfs(i+1,sum+i,m-1);/*再帰をしています。しかし、どうしてここに自分と同じ関数を2つ、入れている   のか、分かりません。あと、どうしてiを足したり、1引いた数を代入しているのでしょうか?*/ */ dfs(i+1,sum,m);   } int main(){ while(scanf("%d%d",&n,&s)!=EOF){//Ctrl+zを押さない限り、無限ループします。 if(n==0 && s==0)break;//問題文通り、2つとも0だったらループを表すwhileから抜けます。 a=0; dfs(0,0,n);//ここもわからないです。ただ、関数dfsの動きが分かれば、分かると思います。 printf("%d\n",a); } return 0; } 再帰は今苦戦していますので、ここでもっと理解を深め、自作関数で使えるようになりたいです。 長文失礼しました。 よろしくお願いします。

  • VBA マクロ エラー1004 アプリケーション定義またはオブジェクト定義のエラー

    VBAで正当表と入力表の正誤判定を一気に行いたいのですが If Cells(a, b).Value = Cells(c, d).Value Thenの部分で エラー1004、アプリケーション定義またはオブジェクト定義のエラーと出てしまいます。 エラーの対処の仕方を調べたのですがわかりませんでした。 教えていただけるとありがたいです。 以下作ったプログラムです。 Sub 正誤判定() Dim a Dim b Dim c Dim d Dim e Dim i Dim j Dim x Dim y Dim hokan Dim ytate Dim xyoko a = 3 b = 21 c = 3 d = 43 e = 2 i = 1 j = 1 Do While j < 261 Do While i < 11 If Cells(a, b).Value = Cells(c, d).Value Then a = a + 1 c = c + 1 If Cells(a, b) = Cells(c, d) Then hokan = Cells(e, b).Value ytate = Range("B2:S15").Find(hokan, lookat:=xwhole).Row + 15 xyoko = Range("B2:S15").Find(hokan, lookat:=xwhole).Column Cells(ytate, xyoko).Value = Cells(ytate, xyoko).Value + 1 Else End If Else End If a = a - 1 c = c - 1 b = b + 1 d = d + 2 i = i + 1 Loop a = a + 3 c = c + 3 e = e + 3 j = j + 1 Loop End Sub

  • 最大公約数を再帰で求める(pascal)

    入力した整数値の最大公約数を出力するプログラムを再帰呼び出しの形式で作れ、という課題が出ました。 再帰でない形式は下のように作れたのですが、再帰形式がどうしてもできません。どなたかご教授ください。 function gcd(a,b:integer):integer; {関数部} var tmp:integer; begin if a<b then begin tmp:=b; b:=a; a:=tmp end; repeat tmp:=b; b:=a mod b; a:=tmp until b=0; gcd:=a end; repeat {計算部、i=n=入力した個数、max=入力できる最大数} i:=i+1; n:=n+1; data[i]:=x; writeln('値:'); readln(x); until (x=0) or (i=max); if i>=2 then begin p:=gcd(data[1],data[2]); if i>=3 then begin for i:= 3 to n do begin p:=gcd(p,data[i]) end; writeln('最大公約数:',p) end else begin writeln('最大公約数:',p) end;

  • 再帰呼び出しで求めたい経路を表示させたい!

    以前も「すべての経路を求めるには」というような質問をして再帰呼び出しにより無事解決することが出来ました。 しかし、少しわからないところがあります。 例えばaはb1とb2に接続されていてb1とb2はそれぞれc1,c2とc3,c4に接続されているとします。すべての経路は全部で4本ですね。 これを再帰呼び出しの中にprintf文を用いて表示させたところ a->b1->c1 c2 b2->c3 c4 というような感じで表示されたと思います。これは再帰呼び出しの性質で分岐があった以前の場所へ戻って探索を続けるからだというのは理解できました。しかし、実際は a->b1->c1 a->b1->c2 a->b2->c3 a->b2->c4 というように表示させたいです。何かこれを記憶するための変数が必要だと思うのですが、それを用いて上のように表示させるほう方法が思いつきません。 さらに、a->b2->c3というように特定の経路だけを選択して表示させたいです。アドバイスよろしくお願いします!

  • 再帰関数について

    非負の整数nに対して次のように定義された 関数F(n),G(n)がある。F(5)の値はいくらか。 関数 F(n):if n=<1 then return1 else return n×G(n-1) G(n):if n=0 then return0 else return n+F(n-1) (1)50 (2)65 (3)100 (4)120 正解 (2)65 以下解説 F(5):5×G(5-1)=5×(G(4))    =5×(4+F(4-1))=5×(4+(F(3)))    =5×(4+(3×G(3-1)))=5×(4+(+3×G(2))))    =5×(4+(3×(2+F(2-1))))=5×(4+(+3×(2+F(1)))))    =5×(4+(3×(2+(1))))    =65 再帰関数についての知識が皆無なので 教えて頂きたいのですが、なぜ=後の5×は残るのでしょうか。 そもそも再帰関数とは、どんなことを言っているのでしょうか。 具体例を挙げて頂くか、分かり易いURLを教えて頂けると幸いです。 お手数ですが、上記について1つ1つ丁寧に解説して頂きたいです。 大変ご迷惑な質問かと思いますが、分かる方おられましたら、 お手数ですが、ご教授お願いします。 以上、よろしくお願い致します。

  • 再帰について

    こんばんは。 今、大学でC言語の勉強しているのですが、昨日再帰についての講義がありました。 講義の中で以下のプログラムを作成したのですが、このプログラムの 実行結果がなぜ以下のようになるか分かりません。 どなたかご教授ください。 結果:9 8 7 6 5 4 3 2 1 0 プログラム: #include<stdio.h> main() { function(0); } function(int i){ if(i<10) { function(i+1); printf("%2d",i); return i; } }

  • 自然な英語表現を知りたいです。

    もし、aなら、そのときb、だから、c、よって、d、ゆえに、e、という文章を自然な英語に訳すとどうなりますか?if a, then b, so c という文なら見たことがありますが、それ以上長くつなげたものは見たことありません。もし、if a, then b, so c, thus d, hence e とすれば、不自然でしょうか?他に英語での自然な言い方がありますか?

  • 複数条件のIFの入れ子の方法

    Excel2010です。 複数グループの判定条件を入れ子で記述したいのですがうまくいきません。 1グループでは次のようにできました。 =IF(OR(A5=1,B5=1,C5=1,D5=,1),A10,0) A5からD5のうちどれかが1ならA10に表示されているテキストを表示せよ。 2グループでは次のように記述しましたがうまくいきません。 =IF(OR(A5=1,B5=1,C5=1,D5=,1),A10,IF(OR(E5=1,F5=1,G5=1,H5=,1),A15,0) ) これが5グループまで続きます。とりあえず1グループずつ確認しているのですが2グループでうまくいきません。教えてください。

専門家に質問してみよう