하스켈 재귀함수에 대하여

jenkince의 이미지

재귀함수를 공부중인데 잘 모르는 부분이 있어서 질문드립니다...

m ≤ n 을 만족하는 두 정수가 있을 때 m 과 n 사이의 정수들의 합을 구하라는 식인데요..

#include
main() {
int m = 2;
int n = 10;
printf("result is %d\n", sum(m, n));
}

------------------------------------

이 밑에 하스켈 용어로 재귀함수를 구현해야하는데

int sum(int m, int n) {
int k, ret;
if(m <= n)

여기 뒷 부분을 어떻게 짜야할지 모르겠습니다..
머리속으로는 두 정수를 비교하고 조건식을 만족하면
출력해야한다고는 알겠는데 그걸 식으로 표현을 못하겠네요..

C로 표현하면

int sum(int m, int n) {
int k = 0;
for ( ; m <= n; m++) k = k + m;
return k;
}

아마도 이러지 않을까 싶은데.. 도와주십쇼...

isson16127의 이미지

하스켈을 배우는가보네요 . 어느학교인가요..?

mySum:: Integer -> Integer -> Integer
mySum a b = if (a == b) then a
else mySum a a + mySum (a + 1) b

yielding의 이미지

require "test/unit"
 
class Numeric
  def sum_upto b
    return (self == b) ? b : self + (self + 1).sum_upto(b)
  end
end
 
class TestSum < Test::Unit::TestCase
  def test_sum
    assert_equal(10,  10.sum_upto(10))
    assert_equal(55,   1.sum_upto(10))
    assert_equal(5050, 1.sum_upto(100))
  end
end

Life rushes on, we are distracted

jenkince의 이미지

클래스는 아직 공부하지 않았어요 ㅠ 클래스를 쓰지않고
아래 쪽을 재귀함수로 고쳐서 풀라고 하는데 헤깔리네여 ㅠ

Fe.head의 이미지

얼랭으로 한번

-module(sumBetween).
-compile(export_all).
 
sumBetween(A, B)    when    A =:= B -> A;
sumBetween(A, B) -> A + sumBetween(A+1, B).

$ erl
1> c(sumBetween).
{ok,sumBetween}
 
2> sumBetween:sumBetween(1, 10).
55

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

Fe.head의 이미지

c언어라면

#include <stdio.h>
 
int sumBetween(int a, int b)
{
      if(a == b)
              return a;
 
        return a + sumBetween(a+1, b);
}
 
int main()
{
    printf("%d\n", sumBetween(1, 10));
    return 0;
}

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

alwaysN00b의 이미지

int sumbw(int f,int e){
    if(f==e) return f;
    else if(f>e) return 0;
    else return f+e+sumbw(f+1,e-1);
}
 
int main(int argc,char *argv[]){
    printf("sum : %d\n", sumbw(1,10));
    return 0;
}

언제나 시작

이응준의 이미지

아래와 같이 guard절을 쓰는 방법도 있습니다.

mysum m n
    | m <= n = m + mysum (m + 1) n
    | otherwise = 0
익명 사용자의 이미지

등차수열의 합 공식을 사용하면 될 것 같습니다. (m+n)*(n-m-1)/2로 하시면 될 것 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.