티스토리 뷰

OS/micro:bit

micro:bit - 함수를 인자로 호출하기

파란크리스마스 2019. 11. 9. 18:00
728x90

출처

함수를 인자로 호출하기

JavaScript에서 함수를 호출할때 함수를 변수처럼 인자로 전달하는 방법을 문의가 있어서 구현 시도해보았습니다.

결론을 말하자면 완벽하게 micri:bit에서는 함수를 인자로 호출은 되지만 인자나 반환값이 없는 함수는 가능힙니다.

편법으로 전달되는 함수의 인자와 반환값을 전역변수로 선언하고 전역변수를 사용하는 방식으로 구현해보았습니다.

함수를 인자로 전달하는 자료형은 Action 타입을 사용하시면 됩니다.

일반 JavaScript 소스

var fc = function (x) { return Math.sin(x) - Math.cos(x) + (1/2) };

function bisection(f,a,b,etol){
  
  console.log("f(a)= "+f(a)+", f(b)= "+f(b)+", f(a)*f(b)= "+f(a)*f(b));
  var a_n = a;
  var b_n = b;
  var e = 100;
  var n = 0;
  var c_n = (a_n + b_n)/2;
  while (n < 30){
    n++;
    if ((b_n - a_n) > etol){
      if (f(c_n)*f(a_n) < 0){
        a_n = a_n;
        b_n = c_n;
        e = c_n - a_n;
        }
      else if (f(c_n)*f(b_n) < 0){
        a_n = c_n;
        b_n = b_n;
        e = b_n - c_n;
        }
      }
    else if ((b_n - a_n) < etol){
      var arr = [a_n, b_n, c_n, e];
      return arr;
      }
    if (n == 30){
      var arr = [a_n, b_n, c_n, e];
      return arr;
      }
    

    }

}

bisection(fc, 0, 1, 0.0001)

micro:bit JavaScript 소스

let param1: number; // 첫번째 파라미터용 전역변수
let result: number; // 반환값을 위한 전역변수
 
let fc = function () { result = Math.sin(param1) - Math.cos(param1) + (1 / 2); }; // 함수 변수로 선언
 
function bisection(f: Action, a: number, b: number, etol: number): number[] {
    let a_n = a;
    let b_n = b;
    let e = 100;
    let n = 0;
    let c_n = (a_n + b_n) / 2;
    while (n < 30) {
        n++;
        if ((b_n - a_n) > etol) {
            // -- f(c_n)
            param1 = c_n;
            f();
            let result_c_n = result;
            // -- f(a_n)
            param1 = a_n;
            f();
            let result_a_n = result;
            // -- f(b_n)
            param1 = b_n;
            f();
            let result_b_n = result;
            if (result_c_n * result_a_n < 0) {
                a_n = a_n;
                b_n = c_n;
                e = c_n - a_n;
            }
            else if (result_c_n * result_b_n < 0) {
                a_n = c_n;
                b_n = b_n;
                e = b_n - c_n;
            }
        }
        else if ((b_n - a_n) < etol) {
            let arr = [a_n, b_n, c_n, e];
            return arr;
        }
        if (n == 30) {
            let arr = [a_n, b_n, c_n, e];
            return arr;
        }
    }
    let arr = [0,0,0,0];
    return arr;
}

let resultArray = bisection(fc, 0, 1, 0.0001);
basic.showNumber(resultArray[0]);
//basic.showNumber(resultArray[1]);
//basic.showNumber(resultArray[2]);
//basic.showNumber(resultArray[3]);
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함