• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:専門学校で情報処理の勉強しております。自宅のパソコンが故障しており使用)

専門学校で情報処理の勉強中にパソコン故障。有識者に頼みたい。

このQ&Aのポイント
  • 専門学校で情報処理の勉強中に自宅のパソコンが故障しており使用不可能です。
  • プログラムを実行する必要がありますが、パソコンの故障で困っています。
  • 有識者の方に教えていただきたいです。質問内容は、class Calculator内で引数nとpを使用して再帰的に計算を行っています。出力の値を教えてください。

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

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

再帰プログラムですから,プログラムを実行して最終的なc.countの値だけ表示しても理解できるものではないと思います。nに適当な値を入れて手動でトレースすれば理解できるのではないですか。 -------- n=1の場合のcalc()メソッドの呼ばれ方は次のとおり。 (注意:右から左に読んでください) calc(1,2)←calc(1,1)←calc(1,0) for文によって一方向の枝が伸び,if(p>n) return なのでそれが n+1段階つまり今回は2段階繰り返される。よって出力される値は3です。 -------- n=2の場合のcalc()メソッドの呼ばれ方は次のとおり。 calc(2,3)←calc(2,2)←calc(2,1)←calc(2,0) calc(2,3)/ calc(2,3)←calc(2,2)/ calc(2,3)/ calc(2,3)←calc(2,2)←calc(2,1)/ calc(2,3)/ calc(2,3)←calc(2,2)/ calc(2,3)/ for文によって2方向の枝が伸び,if(p>n) return なのでそれが n+1段階つまり今回は3段階繰り返される。よって出力される値は15です。 -------- 上図で表現してきたcalc()メソッドの呼び出し回数を式で表現すると次のとおり。 3回 = (1×1)+1+1 15回 = (2×2×2)+(2×2)+2+1 この結果から,n=3の場合は次のようになることが推測できるでしょう。 121回 = (3×3×3×3)+(3×3×3)+(3×3)+3+1 ここまでくればPCの故障は関係ないはずです。nを用いたらどう表現できるか考えてみてください。学校の宿題かもしれないので最終的な解答は省略ということで。

poeee
質問者

お礼

ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 以下の問題の式について教えてください。

    以下についてご教示願います。 class Calculator { public int count = 0; public void calc(int n, int p) { count++; if (p>n) return; for (int i=0; i<n; i++) { calc(n, p+1); } } } // int nは、キーボードからの入力 Calculator c = new Calculator(); c.calc(n, 0); System.out.println(c.count); この時、出力されるc.countはどのくらいですか? nを用いた式で表してください。

    • ベストアンサー
    • Java
  • java iを1づつ増やすプログラムと2づつ増やすプログラム

    次のようにすればiを1づつ増やして表示されます。 class Calc{   int i=1;   int add(){     return i++;   } } class Count{   public static void main(String[] args){     Calc calc = new Calc();     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());   } } 実行結果 i = 1 i = 2 i = 3 しかし次のように2づつ増やそうとすると、 class Calc{   int i=1;   int add(){     return i+2;   } } class Count{   public static void main(String[] args){     Calc calc = new Calc();     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());   } } 実行結果 i = 3 i = 3 i = 3 このようになってしまいます。どこがおかしいのでしょうか?

    • ベストアンサー
    • Java
  • プログラムの違いを教えて下さい・・・

    public class Gold1 { static int prime(int number){ int count=0; for(int i=2; i<number; i+=2){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; //System.out.println("4=2+2"); for(n=6; n<=100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ //System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } ---------------------------------------------------------------- この上のプログラムの一部を ---------------------------------------------------------------- if(prime(p)==0 && prime(n-p)==0){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } ---------------------------------------------------------------- というふうに変えたらどういう意味があるのですか??

    • ベストアンサー
    • Java
  • ゴールドバッハの予想について・・・

     ゴールドバッハの予想(4以上の任意の偶数は,2つの素数の和で表せる)を表すJavaプログラムを作りたいのですが、できるだけ計算経過時間を短縮したいんです。  下のプログラムを改善して、計算経過時間が速くなるようにして下さい。  どういう理由で改善したのかも付け加えてくれると嬉しいです。 -------------------------------------------------------------------------------------------------------------------------------- public class Gold { static int prime(int number){ int count=0; for(int i=1; i<=number; i++){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; for(n=4; n<100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } --------------------------------------------------------------------------------------------------------------------------------

    • ベストアンサー
    • Java
  • ゴールドバッハの予想についてのプログラムなんですが・・・

     ゴールドバッハの予想(4以上の任意の偶数は,2つの素数の和で表せる)を表すJavaプログラムです。 ---------------------------------------------------------------- public class Gold { static int prime(int number){ int count=0; for(int i=1; i<=number; i+=2){ if(number%i==0) count++; } return count; } public static void main(String[] args) { long start = System.currentTimeMillis(); int n, p; //System.out.println("4=2+2"); for(n=6; n<100000; n+=2){ for(p=2; p<n; p++){ if(prime(p)==2 && prime(n-p)==2){ //System.out.println(n + "=" + p + "+" + (n-p)); break; } } if(p==n){ //System.out.println("この予想は間違いと判明!"); break; } if(n%1000==0){ long stop = System.currentTimeMillis(); System.out.println(n + " " + (stop-start)); } } } } ---------------------------------------------------------------- 『for(int i=1; i<=number; i++){ のループ、number まで回しているのが無駄である。素数判定は 2 以上、√number 以下の整数で割り切れれば素数でないのでループの上限は√number で良い。number まで回す必要はなく、i で割り切れた時点で prime=1 として 飛び出せばよい。ループを回り終わっても割り切れていなければ prime=2 で出る。』というコメントを、上に書いたプログラムを変更して表すにはどうしたら良いのですか?? 誰か教えて下さい(*_*) お願いします★

    • ベストアンサー
    • Java
  • javaのRandomで『a~z』までの乱数を表示させたいですが・・・。

    『a~z』の英小文字をランダムで表示させ、さらにint型変数countを『0~9』までランダムに発生させて取得した数だけ『a~z』をランダムに表示させたいのですが、表示結果が(例)aaaaa・・・ となってしまいます。本当は、acyxd・・・とランダムに表示させたいのですがどうすれば、よいでしょうか? import java.util.*; import java.io.*; class CharCheck{  public char charRandom(){ int n; char c = ' '; Random ran = new Random(); while(true){  n = ran.nextInt(123); if(n >= 97 && n <= 122){  c = (char)n;    break; }  }  return c; } public class RandomTest extends CharCheck{  public static void main(String args[]){   char ch[] = new char[10]; int count = 0; CharCheck ChChk = new CharCheck(); Random ran = new Random();   komoji = ran.nextInt(9);//英小文字をいくつ表示するかランダムで決める? (1以上とする) if(count == 0){    count++; } for(int i=0; i<count; i++){ ch[i] = ChChk.charRandom();    System.out.println(ch[i]); } } }

    • ベストアンサー
    • Java
  • 簡易電卓の問題がわかりません!

    簡易電卓のプログラミングについてご教授お願いしたく投稿いたしました。ほぼ合っていると思うのですが、実行できません。一番下の・・・の部分のプログラミングを教えてください!よろしくお願いいたします! import java.io.*; class TestCalc{ public static void main(String[] arg) { BufferedReader input= new BufferedReader(new InputStreamReader(System.in)); Calc calc=new Calc(); try{ String line; System.out.print("==> "); while((line=input.readLine())!=null){ int x=calc.process(line); System.out.println(x); System.out.print("==> "); } }catch(IOException e){ } } } //この後、Calcクラスの定義 class Calc{ private IntStack st; Calc(){ st=new IntStack(); } int process(String s) { if (s.equals("+")) { int n=st.pop()+st.pop(); st.push(n); return n; } else if (s.equals("-")) { } else if (s.equals("*")) { } else if (s.equals("/")) { } else { int n=Integer.parseInt(s); st.push(n); return n; } } } class IntStack{ ... }

    • ベストアンサー
    • Java
  • new演算子で困っています。

    基底クラスclass1と派生クラスclass2でnewを使って同じサイズの2次元配列pとqを作ったのですが、メモリ内の同じ場所を参照してるみたいで、class2の配列qで配列の中身を書き換えたら、class1の配列pの中身も書き換えられているんですが、対処法があれば教えてください。 class class1{ protected:      int** p; public:     class1(int n)     {   int i;        *p=new int[n];        for(i=0;i<n;i++){          p[i]=new int[2];        }      }    :    : }; class class2 : public class1{     int** q; public:     class2(int n)     {   int i;        *q=new int[n];        for(i=0;i<n;i++){         q[i]=new int[2];        } }    :    : };

  • Javaのプログラムの質問です。

    Javaのプログラムについての質問です。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。  注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中に番号を振ってあります。 import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; import java.util.List; class LocalList implements List{  private int Count;  private String Data[];  private Iterator ite;  private ListIterator lite;  // コンストラクタ  void mylist(){   Data = new String[10];   Count = 0;  }  (1)  public boolean add(Object str){   if(Count >= 10){    return false;   }   Data[Count ++] = new String((String)str);   return true;  }  public void add(int i,Object str){  }        public boolean addAll(Collection c){   return false;  }        public boolean addAll(int i,Collection c){   return false;  }    (2)  public void clear(){   Count = 0;  }  public boolean contains(Object str){   return false;  }          public boolean containsAll(Collection c){   return false;  }  public boolean equals(Object str){   return false;  }    (3)  public Object get(int i){   return (i >= Count);  }  public int hashCode(){   return -1;  }  public int indexOf(Object str){   return -1;  }  public boolean isEmpty(){   return false;  }  public Iterator iterator(){   return ite;  }     public int lastIndexOf(Object str){   return -1;  }     public ListIterator listIterator(){   return lite;  }     public ListIterator listIterator(int i){   return lite;  }    (4)  public Object remove(int i){   return (i >= Count);  }    public boolean remove(Object str){   return true;  }         public boolean removeAll(Collection c){   return false;  }         public boolean retainAll(Collection c){   return false;  }    (5)  public Object set(int i,Object str){   return Data[i];  }    (6)  public int size(){   return Count;  }  public List subList(int i,int j){   return this;  }  public Object[] toArray(){   return Data;  }  public Object[] toArray(Object[] a){   return Data;  } } class Main {  public static void main(String[] args) {   mylist sub = new mylist();   sub.add("ビルドバーニングガンダム");   sub.add("ライトニングガンダム");   sub.add("ウイニングガンダム");   sub.add("ガンダムフェニーチェリナーシタ");   sub.add("R・ギャギャ");   for(int i = 0; i < sub.size(); i++){      System.out.println(sub.get(i));   }   // 改行   System.out.println();   // setメソッド   sub.set(1,"ガンダムエピオン");   for(int i = 0; i < sub.size(); i++){    System.out.println(sub.get(i));   }   // 改行   System.out.println();   // sizeメソッド   System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n");   // removeメソッド   sub.remove(1);   for(int i = 0; i < sub.size(); i++){       System.out.println(sub.get(i));   }   // clearメソッド   sub.clear();   System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです");    } } setメソッドとremoveメソッド以外は起動するのようになったのですが、この2つがうんともすんとも動きません。ジェネリクス型を使うという考え方もあるらしいのですが、ネットで調べてもピンと来ず寸詰まり状態になってしまっています。後少しだと思うのですが。。。。 どなたかご教授頂けないでしょうか?よろしくお願い致します。

  • javaのカウントアップについて

    javaのEclipseを使っています。 カウントアップ後、表示する度に、 1, 2, 3, …と表示するプログラムを作りたいです。 プログラム例を教えて下さい。 public class Test { public static void main(String[] args) { Count count = new Count(); int scount = count.read(); count.write(scount); } } class Count { int count = 1; int read() { return count++; } void write(int scount) { System.out.println(scount); } }

このQ&Aのポイント
  • 日々進化するウイルスに対応するおすすめのセキュリティソフトを紹介します。
  • ソースネクスト株式会社の製品・サービスがお勧めです。
  • 安心してインターネットを利用するために、信頼できるセキュリティソフトを選びましょう。
回答を見る

専門家に質問してみよう