久々にプログラミング学習をしようと、pythonに挑戦中です。相変わらずまだ初心者です。
言語は関係のない話にはなりますが
連続する数字の和
例:1+2+3+4+5+6+7+8+9+10=55
これをプログラミングで表現したいとなると、自分なりに考えてみたのは、配列に全部ぶちこんで、sum関数というやつで足すというものでした。
Python
1#配列に全部入れて、すべてを足す sum()関数を使う 2x = [] 3n = 0 4while n != 10: 5 n += 1 6 x.append(n) 7 8#print(type(x)) 9print(x) 10print(sum(x))
関数を使わず、普通の演算子のみで表現したいと思った場合、どんな方法があるでしょうか。
(10+11)*0.5 (mathwords.netより)
といった法則はあるようですが、そういったものは使わず、質素なプログラミングのみの方法でお願いします。
自分ももう少し考えてみます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答11件
0
こんにちは。
ご質問に、
言語は関係のない話にはなりますが
とあったので、使うプログラミング言語が何かによらず適用できる考え方をご質問されているものと思いました。ですので、1から10までを(リストや配列を使ったり、whileループを使ったりして、)列挙して足しあげるのではない、別の考え方を以下に挙げます。
【考え方】
n を自然数として、1から n までの自然数の和を S(n) とすると、以下が成り立つ。
S(1) = 1
S(n) = n + S(n-1) ( ただし、n > 1)
これをプログラムで書くと、再帰呼び出し(recursive call)をする関数を使うことになります。
ご質問には、
関数を使わず、
とありますが、これは「言語に標準で用意されている、sum
のような関数を使わず、」という意味で、関数を新たに定義することは問題ないでしょうか? 問題ないのであれば一例として以下のようになります。
Python
1def sum_from1to(n): 2 if n == 1: 3 return 1 4 return n + sum_from1to(n - 1) 5 6 7print(sum_from1to(10)) # => 55
また、上記が
言語は関係のない話
であることを示すために、sum_from1to
を別の言語で書いてみると、例えば Lisp なら以下になります。
Lisp
1(define (sum_from1to n) 2 (if (= n 1) 3 1 4 (+ n (sum_from1to (- n 1))))) 5
以上、参考になれば幸いです。
追記
なお、実際に再帰関数を用いたプログラムを書く際には、再帰の回数に適切な上限を設ける必要があります。たとえば、上記のsum_from1to
を sum_from1to(0)
と呼ぶと、永遠に再帰呼び出しをすることになり、どこかでスタックオーバーフローを起こして異常終了します。ですが、この回答では「再帰で求める」という考え方自体を示すことが主たる目的なので、(つまり、回答中にあるPythonやLispによるコードよりも、**【考え方】**に書いた漸化式のほうが主なので、)あえてスタックオーバーフロー対策のコード追加はしていません。
投稿2018/08/13 23:20
編集2018/08/15 10:33総合スコア9058
0
自分が手計算するときはこうやってるかも。
python
1m = 10 2n = 1 3ans = 0 4while n < m 5 #両端から足す。(1+10,2+9,...,5+6) 6 ans += n + m 7 n += 1 8 m -= 1 9 10#奇数のときは中央値を最後に足す。(今回は10なので素通り) 11if n == m 12 ans += n 13 14print(ans)
コードで書くとちょっと変か。。。
投稿2018/08/14 06:31
編集2018/08/14 08:21総合スコア672
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/08/14 07:00
2018/08/14 07:08 編集
退会済みユーザー
2018/08/14 07:11
2018/08/14 07:49 編集
2018/08/14 07:51
2018/08/14 08:08
2018/08/15 03:03
0
みなさん難しく考え過ぎですよ。
python3
1sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
ベストアンサーはいただきました。
投稿2018/08/13 21:19
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/13 23:45
退会済みユーザー
2018/08/14 06:54 編集
2018/08/14 09:26
退会済みユーザー
2018/08/14 09:39 編集
退会済みユーザー
2019/06/03 05:08
0
「配列に全部ぶちこむ」のは、手間が一つ余計でしょう。メモリも無駄に占有することになると思います。
whileループを回すまで思いついたなら、
n=0 s=0 while n != 10: n += 1 s += n print(s)
しかし、whileではなくforを使うのが素直だと思います。rangeは関数だからダメという話でなければですが。
for n in range(1,11): s += n print(s)
ちなみにsumを使っていいのだったら、次のコードでできそうです。
print(sum(range(1,11)))
投稿2018/08/13 20:54
総合スコア13671
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
整数の等差数列ならrangeを使えばいいかも。
Python
1a = sum(i for i in range(1, 11)) 2print(a)
別解?
Python
1def myadd(n): 2 return n + myadd(n-1) if n else 0 3print(myadd(10))
メモリー効率がこの上なく悪いうえに、手元の環境では2968までしか計算できませんでしたが、お遊びということで。
投稿2018/08/13 20:39
編集2018/08/14 01:59総合スコア3601
0
多くの方から低評価がありましたので、こちらの回答は削除させていただきます。
投稿2018/08/13 21:16
編集2018/08/14 08:22退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/14 05:24
退会済みユーザー
2018/08/14 05:39
退会済みユーザー
2018/08/14 06:56
退会済みユーザー
2018/08/14 08:27
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。