1. 程式人生 > >遞迴及練習

遞迴及練習

遞迴:

先傳遞,後迴歸。必須有跳出才有結果。自己呼叫自己。

找規律
eg:
用遞迴算階乘   5的階乘   1 * 2 * 3 * 4 * 5
分析:
5!  ==     5    *     4!

4!  ==     4    *     3!

3!  ==     3    *     2!

2!  ==     2    *     1!


fn(5);
return 5 * fn(4);

fn(4)
return 4 * fn(3)

fn(3)
return 3 * fn(2)

fn(2)
return 2 * fn(1)

......

//實現
function fn(n){
   if(n == 1) return 1;
   return n * fn(n-1);
}
console.log(fn(5));

11.遞迴案例

1.利用遞迴求1-100的和
//分析
// 100 + fn(99);
// 99 + fn(98);

//實現
function sum(n){
if(n <= 1) return 1;
return n + sum(n-1);
}
console.log(sum(5));
2.兔子 3個月成年  ——>  繁殖
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987
//分析:
fn(n) = fn(n-1) + fn(n-2);

fn(10) = fn(9) + fn(8);
fn(9) = fn(8) + fn(7);
fn(8) = fn(7) + fn(6);
....

function fn(n){
   if(n == 1 || n == 2){
       return 1;
  }
   return fn(n-1) + fn(n-2);
}
console.log(fn(8));
3.求最大公約數(輾轉相除法(計算過程為:兩個數相除得到餘數,餘數不為0時,讓兩個數中的最小數與餘數在相除,直到餘數為0時,那個最小數就為它們的最大公約數))
function fn(m,n){
   var r = m % n;
   m = n;
   n = r;
   if(r == 0){
       return m;
  }else{
       return fn(m,n);
  }
}
console.log(fn(16,8));
4.編寫一個函式,輸入n為偶數時,呼叫函式求1/2+1/4+...+1/n,當輸入n為奇數時,呼叫函式求/1+1/3+...+1/n

  分析:
  10    1 / 10 + 1 / 8 + 1 / 6
  11    1 / 11 + 1/ 9 + 1 / 7....

  規律:1 / n + fn(n - 2);
  實現:
  function fn(n){
    if(n == 1 || n == 2){
    return 1/n;
  }
  return 1 / n + fn(n-2);
  }
  console.log(fn(1