알고리즘기초연습

재귀

paulaner80 2021. 9. 26. 10:37
반응형

1. 기본

재귀가 무한루프에서 빠지지 않으려면
base case     :  적어도 하나의 recursion에 빠지지 않는 경우가 존재해야합니다.
recursion case :  recursion을 반복하다 보면 결국 base case로 수렴해야합니다.

자바스크립트 코드 입니다.

const fun = function(n){
    if(n<1){
        //base case 
        return;
    }else{
        //recursion case
        console.log("hello");
        fun(--n);
    }
}
fun(3);

 

 

 

 

2. 패턴사용.

2-1. 컴포지트패턴으로 만들어 봤습니다.

const Number = class{
    constructor(data){
        this._data = data;
        this._next = null;
    }
    getNext(){
        return this._next;
    }
    setNext(number){
        this._next = number;
    }
    execute(){
        console.log(`hello ${this._data}`)
    }
}

const Rec = class{
    constructor(){
        this._head = null;
    }

    addFirst(data){
        const newNumber = new Number(data);
        newNumber.setNext(this._head);
        this._head = newNumber;
    }

    hello(){
        this._hello2(this._head);
    }

    _hello2(number){
        if(number){
            number.execute();
            const n = number.getNext();
            this._hello2(n);
        }
    }
}

const rec = new Rec();
rec.addFirst(1);
rec.addFirst(2);
rec.addFirst(3);

rec.hello();

 

2-2. 재귀적으로 합산하는 기능을 넣어 봤습니다.

addLast기능도 추가했습니다.

const Number = class {
  constructor(data) {
    this._data = data;
    this._next = null;
  }
  getNext() {
    return this._next;
  }
  setNext(number) {
    this._next = number;
  }
  sum() {
    if (this._next) 
			return this._data + this._next.sum();
    else
			return this._data;
  }
};

const Rec = class {
  constructor() {
    this._head = null;
  }

  addFirst(data) {
    const newNumber = new Number(data);
    newNumber.setNext(this._head);
    this._head = newNumber;
  }

  addLast(data) {
    const newNode = new Number(data);
    if (this._head == null) {
      this._head = newNode;
      return;
    }
    let p = this._head;
    while (p.getNext() != null) {
      p = p.getNext();
    }
    p.setNext(newNode);
  }

  sum() {
    return this._head.sum();
  }
};

const rec = new Rec();

let n = 6;
while (n--) {
  rec.addLast(n);
}

console.log(rec.sum());