Maison  >  Questions et réponses  >  le corps du texte

javascript - Problème d'algorithme récursif.

Si votre patron vous donne un yuan le premier jour, il vous donnera chaque jour le double du montant de la veille. C'est 1, 2, 4, 8.... . Maintenant, après 30 jours, combien d’argent avez-vous reçu au total ?
Exigence : utiliser la fonction récursive pour implémenter

我想大声告诉你我想大声告诉你2640 Il y a quelques jours1271

répondre à tous(5)je répondrai

  • 给我你的怀抱

    给我你的怀抱2017-07-07 10:37:05

    Le problème est très simple, la clé réside dans l'idée, voici le code.

    /*
    ·递归
      1. salarySum(n) = salarySum(n-1) + salary(n)
      2. salary(n) = 2 ^ (n-1)
    
    ·非递归
      循环
    */
    
    function salary(nthDay){
      return Math.pow(2, nthDay-1)
    }
    
    // 递归
    function salarySum(nthDay) {
      if (nthDay > 1) {
        return salarySum(nthDay - 1) + salary(nthDay)
      } else {
        return 1
      }
    }
    
    // 非递归
    function salarySum(nthDay) {
      let day = 1
      let sum = 0
      while (day <= nthDay) {
        sum += salary(day)
        day++
      }
      return sum
    }

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-07-07 10:37:05

    PHP版本
    
    function recursion($day){
        if($day == 1){
            return 1;
        }else{
            return recursion($day - 1) + pow(2,$day - 1);
        }
    }
    echo recursion(30);

    répondre
    0
  • PHP中文网

    PHP中文网2017-07-07 10:37:05

    Haha, dommage, j'ai lu la mauvaise question

    #不递归的实现方式
    def fn(n):
        return 2 ** (n - 1)
    
    #递归的实现方式
    def fn1(n):
        return 1 if n <= 1 else fn1(n-1) * 2
    

    répondre
    0
  • 習慣沉默

    習慣沉默2017-07-07 10:37:05

    #!/usr/bin/env python
    
    def salary(n):
        '''Your salary everyday'''
        if n <= 1:
            return 1
        return 2*salary(n-1)
    
    
    def money(n):
        '''Total money you get for n days.'''
        if n <= 0:
            return 0
        s = salary(n)  # or s = 2**(n-1)
        m = money(n-1)
        print("day %d: salary[%d] total[%d]" % (n, s, (s+m)))
        return s+m 
    
    money(30)

    jour 1 : salaire[1] total[1]
    jour 2 : salaire[2] total[3]
    jour 3 : salaire[4] total[7]
    jour 4 : salaire[8] total[15]
    jour 5 : salaire[16] total[31]
    jour 6 : salaire[32] total[63]
    jour 7 : salaire[64] total[127]
    jour 8 : salaire[128] total[255]
    jour 9 : salaire[256] total[511]
    jour 10 : salaire[512] total[1023]
    jour 11 : salaire[1024] total[2047]
    jour 12 : salaire[2048] total[4095]
    jour 13 : salaire[ 4096] total[8191]
    jour 14 : salaire[8192] total[16383]
    jour 15 : salaire[16384] total[32767]
    jour 16 : salaire[32768] total[65535]
    jour 17 : salaire[65536] total[131071]
    jour 18 : salaire[131072] total[262143]
    jour 19 : salaire[262144] total[524287]
    jour 20 : salaire[524288] total[1048575]
    jour 21 : salaire[1048576] total[ 2097151]
    jour 22 : salaire[2097152] total[4194303]
    jour 23 : salaire[4194304] total[8388607]
    jour 24 : salaire[8388608] total[16777215]
    jour 25 : salaire[16777216] 4431]
    jour 26 : salaire[33554432] total[67108863]
    jour 27 : salaire[67108864] total[134217727]
    jour 28 : salaire[134217728] total[268435455]
    jour 29 : salaire[268435456] 870911]
    jour 30 : salaire[536870912] total[1073741823]

    répondre
    0
  • 迷茫

    迷茫2017-07-07 10:37:05

    Mon idée est la suivante : calculez d'abord le montant actuel, puis transmettez la date et le montant du jour jusqu'à ce que le calcul atteigne 30 jours.

    function total(all, day,money){
        var day = day || 1,
            money = money || 0.5;
    
        money *= 2;
        // console.log( 'day'+day+': '+ money ); // 输出当前的金额
        day++;
        if(day<=all){
            return money + total(all, day, money);
        }
        return money;
    }
    

    Alors appelez total() :

    total(1); // 1
    total(2); // 3
    total(7); // 127
    total(30); // 1073741823

    répondre
    0
  • Annulerrépondre