汽水瓶换汽水 算法解析

汽水瓶换汽水 算法解析
1元买2瓶汽水,2个汽水瓶换1瓶汽水,
问5元总共能得多少瓶汽水

循环算法

/* 
 * 汽水瓶 循环算法 
 * $n:当前汽水总数, $c:换1瓶汽水需要空瓶数 
 */ 
function get_total($n, $c) 
{ 
    $total = $n; 
    while ($n >= $c) { 
        $t = intval($n / $c); 
        $total += $t; 
        $n = $t + $n % $c; 
        echo "累计汽水数:" . $total . " 当前空瓶数:" . $n . "
"; } // 如最后只差1空瓶可以换汽水,则先借1瓶汽水,喝完汽水还回空瓶 if ($c - $n == 1) { $total += 1; $n = 0; } return "最终汽水数:" . $total . ",最终空瓶数:" . $n; }

累计汽水数:15 当前空瓶数:5
累计汽水数:17 当前空瓶数:3
累计汽水数:18 当前空瓶数:2
累计汽水数:19 当前空瓶数:1
最终汽水数:20,最终空瓶数:0

递归算法

 /* 
 * 递归算法 
 * $n:当前空瓶总数, $c:换1瓶汽水需要空瓶数 
 */ 
function recursive($n, $c) 
{ 
    //至少差两个空瓶,不能换汽水 
    if ($c - $n > 1) { 
        return 0; 
    } elseif ($c - $n == 1) { 
        //差一个空瓶,可以先喝汽水后给瓶 
        return 1; 
    } else { 
        return intval($n / $c) + recursive(intval($n / $c) + $n % $c, $c); 
    } 
}

汽水瓶换汽水数:10
总共汽水数:20

数学算法
公式:换得汽水数 = 汽水瓶数 / (换汽水需要瓶数 - 1)

/* 
 * 汽水瓶 数学算法 
 * $n:当前汽水总数, $c:换1瓶汽水需要空瓶数 
 */
function bottle($n, $c) 
{ 
    return $n + intval($n / ($c - 1)); 
} 

总共得汽水数:20

你可能感兴趣的:(汽水瓶换汽水 算法解析)