プロが教えるわが家の防犯対策術!

おかしな点がありましたらご指摘お願いします

/* nの総和を求める関数 */
int sum(int n)
{
/*     n-1      */
/* f(n) + Σ f(i)  (n > 1)*/
/*     i=1      */
/* f(1)      (n = 1)*/
if (n > 1)
 return n + (n - 1) * (n / 2);/* 直接総和を返す*/
else if (n == 1)
 return 1;
}

A 回答 (8件)

 Σ(シグマ)で総和を求める関数を作りたい?



return n + (n - 1) * (n / 2);  /* 直接総和を返す */
    ↓
  (n^2 + n) / 2

ですよね? 思わず笑わせていただきました。
if は必要ないですよ。 どうしても使いたいという場合は、「ながら」あなたの解答で良いんじゃないでしょうか。


/* txz.c Σf(n) test program
* execution: ./txz 5
* compile:  gcc txz.c -o txz
*/

#include <stdio.h>   /* for printf() */
#include <stdlib.h>   /* for atoi() */
int f(int);

int main(int argc, char *argv[]) {
 int temp;

 temp = atoi(argv[--argc]);
 printf("f(%d) = %d\n", temp, f(temp));

 return 0;
}

int f(int n) {
 // if (n <= 1)
 // return 1;
 // else
  return n + (n - 1) * n / 2;
}
    • good
    • 0

(全くの憶測で、ハズシているとは思いますが、もしやってことも・・無いか?)



>>「n の総和を求める」という日本語の意味が分かりません.
 >これは無視してください自分でも説明出来ないので

「無視」して、かつ、質問者様が課題?を理解していない、または、課題を正しく質問文にできなかった(失礼)と仮定して・・。

>コメント内の関数を作りたいのですが・・・

 コメントの外を含めて int sum() という関数を作り直してみました(分離独立?して関数 f() も)。

・関数 sum() で、n を 1 から 5 までとして、関数 f( n ) を呼び出し、その戻り値を積算(◆)するものを作ってみました。

☆nが5のとき(机上計算で)結果はいくつになるのが正解?でしょうか?。下では32となります。

#include <stdio.h>

int f( int iVal )
{
 if( iVal == 1 ) return( 1 ); // 「たまたま」機能的には、次の行でOK

 return( iVal + ( iVal - 1 ) * ( iVal / 2 ) );
}
int sum( int iOwari )
{
 int n, iSum = 0; // 「和」を求める場合に必要な初期化

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

  iSum += f( n ); // ◆
 }
 return( iSum );
}
void main()
{
 printf( "f(%d) 総和 = %d\n", 5, sum( 5 ) );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0

>いやいや、fとΣで示されたコメント内の定義を忠実に実装するなら



う~~ん、そうなんですけどねえ(笑)。
ただ、コメントのタイトルには

>/* nの総和を求める関数 */

って書いてある(笑)。
f(n)の総和を求めるのとnの総和を求めるんじゃ偉い違いです(苦笑)。

前者だと、確かに高階関数辺り使わないとメンド臭いんですよね(笑)。
Cだと関数ポインタかよ(笑)。ANSI Common Lispなんかじゃ鼻クソホジってる間に記述できるんですが。
    • good
    • 0

いやいや、fとΣで示されたコメント内の定義を忠実に実装するなら


int sum(int n, int (*f)(int)) {
if (n>1) {
return f(n) + sum(n-1, f);
} else if (n==1) {
return f(1);
} else {
return 0;
}
}
でしょう。
返り値の型は勝手にintとしました。
nが0以下の場合は定義が与えられていないので、これも勝手に0としました。
    • good
    • 0

あるいは、単に再帰したいだけか。



/* ここから */

int sum(int n) {
if (n == 1) {
return 1;
} else {
return n + sum(n - 1);
}
}

/* ここまで */
    • good
    • 0

1~nまでの総和を求める関数の場合


 nの値が偶数のときは
   (1+n)*(n/2)
 で合計が計算できます。しかし、nの値が奇数のときは上手くいきません。あたなのプログラムの
   n + (n - 1) * (n / 2);
の部分はこの式を勘違いしたのでしょうか?

ちなみに1~5までの和を求めるプログラムの一部を示しますので、参考にしてください。

int sum=0;
for(int i=1;i<=5;i++){
sum+=i;
}
printf("%d\n",sum);
    • good
    • 1

>コメントの関数を計算したいのです



コメントに書かれているfという関数は、
どういう機能を持っているのでしょうか。
    • good
    • 0

「n の総和を求める」という日本語の意味が分かりません.


コメントを見る限り「f(1)~f(n) の総和を求める」ということでしょうか? もしそうなら, あなたが書いた関数の中で f を全く呼び出していないのはなぜでしょうか?
あるいは「1~n の総和を求める」であったとしても, あなたの書いた関数は正しくありません.
    • good
    • 0
この回答へのお礼

>>「n の総和を求める」という日本語の意味が分かりません.
これは無視してください
自分でも説明出来ないので

>>コメントを見る限り「f(1)~f(n) の総和を求める」ということでしょうか?
コメントの関数を計算したいのです

>>あなたの書いた関数は正しくありません.
どうすればいいのでしょう?
コメント内の関数を作りたいのですが・・・

お礼日時:2009/12/07 15:37

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