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

C言語で、以下の漸化式について
T(0)=1
T(1)=X             のとき

T(k+1)=2XT(k)-T(k-1)    (k = 0,1,2...,20)
を、kを20以下の自分の好きな値を入力して、計算を回して出力するプログラムを以前作りました。


以下にプログラムの内容と結果を書きます。
#include <stdio.h>
#include <math.h>

int main()
{
double x ;
int k ;
int K ;
double T[20] ;

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

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

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

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

//結果//
k = 5
x = 2
T[ 0] = 1.000000
T[ 1] = 2.000000
T[ 2] = 7.000000
T[ 3] = 26.000000
T[ 4] = 97.000000
T[ 5] = 362.000000

k = 4
x = 3
T[ 0] = 1.000000
T[ 1] = 3.000000
T[ 2] = 17.000000
T[ 3] = 99.000000
T[ 4] = 577.000000


今回は上記のプログラムを、関数を使って作りました。
以下にプログラムの内容と結果を書きます。


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

double t[20];

double T(double x, int k)
{
if (k = 0)
{
return 1 ;
}

if (k = 1)
{
return x ;
}

else
{
return 2 * x * t[k] - t[k - 1];
}

}

int main()
{
double x ;
int k, K ;
double t[20];

printf("k = ") ;
scanf("%d", &K) ;

printf("x = ") ;
scanf("%lf", &x) ;

for (k = 0; k <= K; k++)
{
printf("T[%2d] = %lf\n",k,T(x,k));
}
return 0;
}


//結果//
k = 5
x = 2
T[ 0] = 2.000000
T[ 1] = 2.000000
T[ 2] = 2.000000
T[ 3] = 2.000000
T[ 4] = 2.000000
T[ 5] = 2.000000

k = 4
x = 3
T[ 0] = 3.000000
T[ 1] = 3.000000
T[ 2] = 3.000000
T[ 3] = 3.000000
T[ 4] = 3.000000


このように、計算がうまくいきません。
何を直せばうまくいくかなど教えていただけると嬉しいです。
また、C言語、プログラミング初心者なので、わかりやすく丁寧に教えていただけると助かります。
よろしくお願いします。

A 回答 (5件)

C言語における比較演算子は"=="


"="は代入演算子。
if文の()の中が全て"="になっていますね。これを全て"=="に変えましょう。

if(k=0)
はkに0を代入。そしてその代入した値がその式の値として評価されます。
つまり、k=0は偽として処理される。(C言語において式の値が"0"=偽)
kの値はこの時点で"0"になっている。

if(k=1)
kに1が代入される。そしてその式の値は"1"であり真(C言語において式の値が"0"以外=真)
真であるため、ifの後の{}中の式が実行される。return文なのでここでこの関数は終了される。
要するにxの値がそのまま出力される。
当然それ以下の式は実行されない。
    • good
    • 0

誰も漸化式の配列tに代入しないのだから答がでるはず有りません。


それに

if (k=1)

は誤りでしょう。
if (k == 1) ですね。

配列を使うなら素直にループで
関数を使うなら再帰で書きましょう。
    • good
    • 0

典型的な再帰を適用すべきパターンです


https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0

T(x,k) ただし (k>=2) の値は、
T(x,k-1) と
T(x,k-2) を
再帰呼び出しして計算しましょう。
    • good
    • 0

全体は見ていませんけども…。




>if (k = 0)
>{
> return 1 ;
>}
>if (k = 1)
>{
> return x ;
>}

上記のif文で「どのような挙動を期待している」のか説明してください。
# 他の言語とごっちゃになっているんでしょうかね?
    • good
    • 0

tという配列の必要性を今一度考えてみてください


関数内でt[k]を使って計算していますが
tの配列に値を代入しているところはありますか?
    • good
    • 0

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