人に聞けない痔の悩み、これでスッキリ >>

漸化式のプログラミングについて
再帰を用いずに漸化式を完成させよという問題です。

過去に作ったのですが改めてみると「ちよっとなにいってるのかわからない」です。func関数の中身がなぜこんなにごちゃごちゃしているのが教えてください。

int func(int n) {

    int a, b = 2, c = 1, i;

    for (i = 1;i < n;i++) {

        a = 4 * b - c;

        c = b;

        b = a;

    }

    return a;

}



int main(void) {

    int n = 5;

    int i = 5;

    for (i = 2;i <= n;i++)

        printf("%d\n", func(i));

    return 0;

}

A 回答 (2件)

変数の名前をa,b,cなんて安直にやってしまったのが失敗ですね。


a → x_3
b → x_2
c → x_1

と変えたら、ちょっとはわかるのでは?
    • good
    • 1

難しいね!

    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Qこのプログラムを教えてください。

このプログラムを教えてください。

Aベストアンサー

以下のPGで実現出来ます。
難解なところは特にありません。
初めて見る関数などの無いよう、敢えて四則演算を用いて解を導いています。
これを見て、数式の解を表現する1つの方法をぜひ身に付けて下さい。

/* 課題1 */
/* maru.c */

#include<stdio.h>
#include<string.h>
#define PI 3.14

int main() {

float d; /* 入力の直径 */
float e; /* 円周 */
float m; /* 面積 */
float s; /* 表面積 */
float v; /* 体積 */

printf("直径を入力してください[cm]: ");
scanf("%f", &d);

d = d / 2; /* 入力直径を半径に変換 */
d = d / 100; /* 入力値の単位変換 [cm]→[m] */

printf("(1)円の円周 [m] =%f\n", 2 * PI * d );
printf("(2)円の面積 [m2]=%f\n", PI * d * d );
printf("(3)球の表面積[m2]=%f\n", 4 * PI * d * d );
printf("(4)球の体積 [m3]=%f\n", (4.0 / 3.0) * PI * d * d * d);

return 0;
}

以下のPGで実現出来ます。
難解なところは特にありません。
初めて見る関数などの無いよう、敢えて四則演算を用いて解を導いています。
これを見て、数式の解を表現する1つの方法をぜひ身に付けて下さい。

/* 課題1 */
/* maru.c */

#include<stdio.h>
#include<string.h>
#define PI 3.14

int main() {

float d; /* 入力の直径 */
float e; /* 円周 */
float m; /* 面積 */
float s; /* 表面積 */
float v; /* 体積 */

printf("直径を入力してください[cm]: ");
scanf("%f", &d);

d = d / 2; /* ...続きを読む

Qc言語の課題がわかりません

XOR を用いて文字列の暗号化及び暗号化された文字列の復号化をするプログラムを作成し,暗号化した文字列の結果は code.txt に出力し、復号化する際には code.txt からファイルを読み込んで復号化することとし、入力する文字列は最大で 9 文字までとする。暗号化および復号化には鍵として1つの文字用いる。鍵は暗号化の際に入力させ、復号化の際にも同じ鍵を用いる。暗号化は文字列の各文字ごとに鍵との間の XOR を取るものとする。と課題で出たのですが、自分には難しすぎて出来ません。どなたかおしえてください。プログラムの途中経過と実行例を記しておきます。
#include<stdio.h>
int main(){
int x;
char a[256],b[256];

printf("Select Mode 1.Encryption, 2.Decryption :");
scanf("%d",&x);
if(a==1){
printf("Input passphrase :");
scanf("%s",a);
printf("Input key:");
scanf("%d",b);
}else{
printf("Input key:");
scanf("%d",b);

}

if(a==3){
printf("Invalid value\n");
}
return 0;
}
<実行例 1>
Select Mode 1.Encryption, 2.Decryption : 1
Input passphrase : password
Input key : $
TEWWSKV@
<実行例 2>
Select Mode 1.Encryption, 2.Decryption : 2
Input key : $
Code : TEWWSKV@
Decode : password
<実行例 3>
Select Mode 1.Encryption, 2.Decryption : 3
Invalid value

XOR を用いて文字列の暗号化及び暗号化された文字列の復号化をするプログラムを作成し,暗号化した文字列の結果は code.txt に出力し、復号化する際には code.txt からファイルを読み込んで復号化することとし、入力する文字列は最大で 9 文字までとする。暗号化および復号化には鍵として1つの文字用いる。鍵は暗号化の際に入力させ、復号化の際にも同じ鍵を用いる。暗号化は文字列の各文字ごとに鍵との間の XOR を取るものとする。と課題で出たのですが、自分には難しすぎて出来ません。どなたかおしえてください...続きを読む

Aベストアンサー

以下、ファイルの入出力を絡めると理解が遠のくので、
シンプルに、画面を通しての入出力動作をするものにしました。
forループの中で行っている1行が最も重要な箇所なので、じっくり理解して下さい。

#include<stdio.h>
#include<string.h>

int main() {
int x;
char a[9+1];
char b[1+1];
char r[9+1];

memset(a, 0x00, sizeof(a));
memset(b, 0x00, sizeof(b));
memset(r, 0x00, sizeof(r));

printf("Select Mode 1.Encryption, 2.Decryption : ");
scanf_s("%d", &x);
if (x == 1) {

printf("Input passphrase : ");
scanf("%s", a);

printf("Input key: ");
scanf("%s", b);

} else if (x == 2) {
printf("Input key: ");
scanf("%s", b);

printf("Code : ");
scanf("%s", a);

printf("Decode : ");

} else {
printf("Invalid value\n");
return 0;
}

for (unsigned int i = 0; i < strlen(a); i++) {
r[i] = a[i] ^ b[0];
}

printf("%s\n", r);

return 0;
}

以下、ファイルの入出力を絡めると理解が遠のくので、
シンプルに、画面を通しての入出力動作をするものにしました。
forループの中で行っている1行が最も重要な箇所なので、じっくり理解して下さい。

#include<stdio.h>
#include<string.h>

int main() {
int x;
char a[9+1];
char b[1+1];
char r[9+1];

memset(a, 0x00, sizeof(a));
memset(b, 0x00, sizeof(b));
memset(r, 0x00, sizeof(r));

printf("Select Mode 1.Encryption, 2.Decryption : ");
scanf_s("%d", &x);
if (x == 1) {

printf(...続きを読む

Qsleep関数の原理について

sleep関数がPC内でどういった原理で一定時間おきに動作などを行っているのか教えてください。
「Linuxカーネルがどういう働きしている」「ハードがどういう動作している」とかです。

Aベストアンサー

>一定時間おきに動作などを行っているのか
確実にsleep関数で指定した時間はお休みしているだけであり、
厳密には「一定時間おき」に動作はしません。

・LinuxはマルチタスクOSである
・一定時間(確か100Hzだったと思います)ごとにタスク切り換えを行っている

この2点がわかっていれば、
>「Linuxカーネルがどういう働きしている」
は簡単ですよね。

「sleep関数で指定した時間は、タスク切り換えで自分にCPU時間を割り当てることはしない」というだけです。

>「ハードがどういう動作している」
特段ハードでは、sleep関数実現のために何もしていません。

<おまけ>
sleep関数を呼ばなくてもマルチタスクOS上のタスクは、
 ユーザの知らないタイミングで休み休み動いている
ということです。

Qこのプログラミングの問題がいくら考えてもわかりません。for文とif文を組み合わせて使うと言われたの

このプログラミングの問題がいくら考えてもわかりません。for文とif文を組み合わせて使うと言われたのですが、よろしければ教えてください

Aベストアンサー

No.1です、
念のための追加です。

日本語で「〇〇の値が××だったら、、、。そうでなかったら~。」といった表現で書かれたものが多くのプログラミング言語ではifを用いた処理になります。
同じく「〇〇の値が××になるまで、、、を繰り返す。」といった表現で書かれたものfor文やwhile文を用いた処理になります。

参考まで。

QCのif文の書き方の質問です

『x=a & j=1 』の様に、『&』の前後に式を書くことがありますか?
使ったことがないので、ここに質問させて頂いております。
コメント、説明頂けますと大変有り難いです。

if stype=='L' then
x=a & j=1 //===
elseif stype=='M' then
x=a+(h/2) & j=2//============
else x=a+h & j=3//=================
end

以上、宜しくお願いします。

Aベストアンサー

見た目から、命令の区切りに使っているように見えますが、
公式マニュアルを確認しても ; や , はありましたが & は見つけられなかったので断言はできません。

https://help.scilab.org/docs/6.0.1/ja_JP/comma.html
https://help.scilab.org/docs/6.0.1/ja_JP/semicolon.html

QC言語の課題がわかりません char型変数をa個、int型変数をb個、double型変数を4個使うと

C言語の課題がわかりません

char型変数をa個、int型変数をb個、double型変数を4個使うとき、全部で何バイトのメモリを使うか求めるプログラムを作成せよ。なおa,bは実行中にキーボードから入力すること、また各データ型もしくは各変数のバイト数を求める際にはsizeof演算子を使うこと。

という問題なのですが、言っている意味も分からなければどのようなプログラムを書けばよいのかもわかりません。おしえてください

Aベストアンサー

『標準入力から』が正しい表現なんでしょうけど、初学者向けだとキーボードからと書かれる…でしょう。>#3


>またキーボードで入力するということはscanfを使うということなのでしょうか

scanf()だけとは限りませんけどね。
fgets()で取り込んで、数字→数値変換するとかありますし。
が、学校とかの課題レベルならscanf()辺りが妥当でしょう。
ろくにエラー処理してなくても合格もらえるんじゃないでしょうかね。

>変数の内容ではなく個数と書いてある点がよくわからなくて…

サイズ(バイト数)の計算に、個々の変数の内容は関係ないからです。
int型の変数に0が格納されているときと10000が格納されているときでメモリ上のサイズが変動したりはしません。

Q再帰処理をループ処理に変換

趣味プログラマです。

このカテゴリ一個前の質問
https://oshiete.goo.ne.jp/qa/10782948.html
のご回答の中で
> 関数の再帰呼び出しは必ずループで置き換えられる
というものがありました。
このこと自体は、以前にも目にしたことがあるのですが、変換例はいずれも単純な再帰関数のものでした。

そこで質問なのですが2分木を辿るような再帰プログラムの場合は、どの様なループ処理に変換されるのか、教えてください。
具体的なソースをご提示いただければ嬉しいです(C言語でなくても有名どころの言語ならOKです)

また、その処理はメモリ使用の観点において、再帰よりも効率が良くなりますか?
個人的には、プログラム中にスタックの様なものを用意しなければならないので、あまり効率よくならない様な気がします。

ご回答よろしくお願い致します。

※以下は2分木の合計を再帰で求める例です。
----
#include <stdio.h>
#include <stdlib.h>

typedef struct Node_t Node;

struct Node_t {
int value;
Node* left;
Node* right;
};

Node* NewNode(int val){
Node* p = malloc(sizeof(Node));
p->value = val;
p->left = NULL;
p->right = NULL;
return p;
}

int Sum(Node* p){
int lsum = 0;
int rsum = 0;

if(p->left != NULL) lsum = Sum(p->left);
if(p->right != NULL) rsum = Sum(p->right);
return lsum + rsum + p->value;
}

int main() {
int sum = 0;
Node* header;
header = NewNode(10);
header->left = NewNode(20);
header->right = NewNode(30);
header->left->left = NewNode(40);
header->right->right = NewNode(50);

/*もっと深く2分木を作成 */

sum = Sum(header);
printf("%d\n", sum);

return EXIT_SUCCESS;
}
----

趣味プログラマです。

このカテゴリ一個前の質問
https://oshiete.goo.ne.jp/qa/10782948.html
のご回答の中で
> 関数の再帰呼び出しは必ずループで置き換えられる
というものがありました。
このこと自体は、以前にも目にしたことがあるのですが、変換例はいずれも単純な再帰関数のものでした。

そこで質問なのですが2分木を辿るような再帰プログラムの場合は、どの様なループ処理に変換されるのか、教えてください。
具体的なソースをご提示いただければ嬉しいです(C言語でなくても有名どころの言...続きを読む

Aベストアンサー

N分木の総舐めだとすると、こんな感じじゃないですか?
最初に言っておきますが、メモリ効率は平均的によろしくないです。
劣悪な(深い)木よりはましというレベルです。
平衡二分木のように随時木をメンテナンスしていれば別の方法の方が効率は良いと思います。
ただ、スタック領域のメモリ不足は少なくとも私の手元の環境ではエラー検出できませんが、
ヒープ領域のメモリ不足はエラー処理はできます。
DoS攻撃などで勝手に落ちられると困るので、
少なくとも蓄積データのフルダンプや全解放ごときで落ちる心配は取り去りたいという、
ささやかな、見る人によってはくだらないこだわりのような、しかし切実な問題です。

#define N 2
struct tree
{
struct tree *tr_parent; // 追加要素
struct tree *tr_next[N]; // データ構造の小修整
int tr_val;
int tr_ref; // 追加要素
};

int
sum_tree(struct tree *top)
{
struct tree *n, *prev;
int sum = 0;
int updown = 2;

for (n = top, n->tr_ref = 0, n->tr_parent = NULL, prev = n;
n != NULL;) {
if (updown == 0) {
// case down
n->tr_ref = 0;
n->tr_parent = prev;
}
if (n->tr_ref == N) {
sum += n->tr_val;
n = n->tr_parent;
updown = 1;
} else if (n->tr_next[n->tr_ref] == NULL) {
updown = 2;
n->tr_ref ++;
} else {
updown = 0;
prev = n;
n = n->tr_next[n->tr_ref];
prev->tr_ref ++;
}
}
return sum;
}

実際、再帰を使わないようにする変換方法の定式なんてないと思います。
しかし、再起でなければできない処理もなく、等価な別の処理方法はあると思います。

N分木の総舐めだとすると、こんな感じじゃないですか?
最初に言っておきますが、メモリ効率は平均的によろしくないです。
劣悪な(深い)木よりはましというレベルです。
平衡二分木のように随時木をメンテナンスしていれば別の方法の方が効率は良いと思います。
ただ、スタック領域のメモリ不足は少なくとも私の手元の環境ではエラー検出できませんが、
ヒープ領域のメモリ不足はエラー処理はできます。
DoS攻撃などで勝手に落ちられると困るので、
少なくとも蓄積データのフルダンプや全解放ごときで落ちる心配...続きを読む

QC言語について質問です。 下記のように出力する際は、どのように記述すれば良いのでしょうか? ****

C言語について質問です。
下記のように出力する際は、どのように記述すれば良いのでしょうか?
********
* スタート *
********

Aベストアンサー

printf("********\n* %s *\n********\n", "スタート");

QC言語でプログラミングを組みたいんですがcosの使い方がわかりません

x_i = cos((pi*(2i-1))/2N) (i=1,2,…,N)

という式で、N=5,9,17の時の値を求めたいのですが、うまくできません。

頑張ってN=5の式を作ってみたのですがうまくいきませんでした。
C言語、プログラミング初心者でわからないのでできるだけ丁寧に教えていただけると助かります。

自分で作ってみたプログラムを書いてみたので、どこが違うか、またどうすればいいかを教えていただきたいです。



#include <stdio.h>
#include <math.h>

#define iMAX 5

#define PI 3.1415926535


int main()
{

int i ;

int x[iMAX] ;

int n = ((PI * (2i-1) ) / 10) ;

double cos ( n ) ;



for (i = 1; i < 5; i++) {

x[i] = cos ( n );

}


for (i = 1; i<=5; i++) {

printf("x[%d] = %d\n",i,x[i]);

}


return 0 ;


}

x_i = cos((pi*(2i-1))/2N) (i=1,2,…,N)

という式で、N=5,9,17の時の値を求めたいのですが、うまくできません。

頑張ってN=5の式を作ってみたのですがうまくいきませんでした。
C言語、プログラミング初心者でわからないのでできるだけ丁寧に教えていただけると助かります。

自分で作ってみたプログラムを書いてみたので、どこが違うか、またどうすればいいかを教えていただきたいです。



#include <stdio.h>
#include <math.h>

#define iMAX 5

#define PI 3.1415926535


i...続きを読む

Aベストアンサー

cosの結果はdouble型です。
x_i = cos((pi*(2i-1))/2N) は、コード上、正確には
x_i = cos((pi*(2*i-1))/(2*N)) です。
N=5の場合、iを1からNまで変化させればOKです。
以下のようにしてください。
#include <stdio.h>
#include <math.h>
#define N 5
#define PI 3.1415926535
int main()
{

int i;
double x_i;
for (i = 1; i <= N; i++) {
x_i = cos((PI*(2*i-1))/(2*N));
printf("x[%d] = %f\n",i,x_i);
}
return 0;
}
-----------------------
以下、実行結果です。
x[1] = 0.951057
x[2] = 0.587785
x[3] = 0.000000
x[4] = -0.587785
x[5] = -0.951057

cosの結果はdouble型です。
x_i = cos((pi*(2i-1))/2N) は、コード上、正確には
x_i = cos((pi*(2*i-1))/(2*N)) です。
N=5の場合、iを1からNまで変化させればOKです。
以下のようにしてください。
#include <stdio.h>
#include <math.h>
#define N 5
#define PI 3.1415926535
int main()
{

int i;
double x_i;
for (i = 1; i <= N; i++) {
x_i = cos((PI*(2*i-1))/(2*N));
printf("x[%d] = %f\n",i,x_i);
}
return 0;
}
-----------------------
以下、実行結果です。
x[...続きを読む

QC言語プログラミング 漸化式について T(n+1)=2XT(n)-T(n-1) T(0)=1 T(1

C言語プログラミング 漸化式について
T(n+1)=2XT(n)-T(n-1)

T(0)=1
T(1)=X

このチェビシェフ多項式の漸化式を使ってT(16)までの式を出すという課題なんですが、答えを教えてほしいです。
プログラミング初心者で自分でやってもうまくいきません。
お願いします。

見づらいと思うので、課題の内容の写真も貼ってます。

Aベストアンサー

c言語で表現すると以下のようになります。
xの初期値を色々変更して、動かしてみて下さい。

また、特に難しい箇所はありませんので、一行ずつ意味を理解して頂いて、
c言語に慣れてみてください。
なにせ「習うより慣れろ」とよく言われた時代の言語ですので。

#include <stdio.h>

int main()
{
int x = 2;
int n;
long T[17];

T[0] = 1;
T[1] = x;

for (n = 1; n < 16; n++) {
T[n + 1] = 2 * x * T[n] - T[n - 1];
}

for (n = 0; n <= 16; n++) {
printf("T[%2d]= %d\n", n, T[n]);
}

return 0;
}


人気Q&Aランキング