递归如何在ruby中工作?

时间:2018-05-30 11:24:35

标签: ruby recursion

我有这种方法,将数字5用7切换。

<?php
    use \Psr\Http\Message\ServerRequestInterface as Request;
    use \Psr\Http\Message\ResponseInterface as Response;

    require '../vendor/autoload.php';

    $app = new \Slim\App();
    $app->get('/domain/{id}', function (Request $request, Response $response, array $args) {
        $id = $args['id'];
        $response->getBody()->write("Hello, $id");

        return $response;
    });
    $app->get('/domain', function () {
        $jsonContents = file_get_contents('data/data.json');
        echo $jsonContents;
    });
    $app->post('/add', function () {
        $jsonContents = file_get_contents('data/data.json');
        $name = $_POST['addname'];
        $url = $_POST['addurl'];
        $data = json_decode($jsonContents, true);
        $last_item = end($data);
        $last_item_id = $last_item['id'];
        $data[] = array(
            'name' => $name,
            'url' => $url,
            'id' => $last_item_id+1
        );
        $json = json_encode($data);
        file_put_contents('data/data.json', $json);
        header('location:../index.php');
    });
    $app->run();

有人可以解释为什么一旦方法遇到基本情况它就不会返回0吗?

这种递归方法实际上如何工作?它是否将返回的数字附加到下一个数字?

2 个答案:

答案 0 :(得分:0)

基本情况返回0,但整体结果由return switch_digit(num/10) * 10 + digit确定

请使用较小的示例代码,例如switch_digit(15)

num <= 0 # no
digit = num % 10 # 5
digit == 5 # yep, so swap it for a 7

return switch_digit(num/10) * 10 + 7

num/10是1,那么递归switch_digit(1)评估为什么?

num <= 0 # no
digit = num % 10 # 1
digit == 1 # so leave it unchanged
return switch_digit(num/10) * 10 + 1 

num/10为0,所以现在我们点击基本情况

switch_digit(15) == switch_digit(1) * 10 + 7
switch_digit(1) == switch_digit(0) * 10 + 1
switch_digit(0) == 0 # the base case

恢复工作,从较低的结果中插入值:

switch_digit(1) == 0 * 10 + 1  == 1
switch_digit(15) == 1 * 10 + 7 == 17

我还要补充一点,Ruby在这里处理递归的方式并不具体。任何其他递归描述或经典示例(如recursive factorial function)都可以帮助您更好地理解。

答案 1 :(得分:0)

我在代码中添加了一些更改,以便了解它的工作情况。

最后我还预计该方法的值为0,但事实并非如此。 达到了结束,但返回的值不是0. 为什么?

def switch_digit(num, array)
  if num <= 0
    array << num
    p array
    puts "The end"
    return 0
  end
  digit = num % 10
  array << [digit, num]
  if (digit == 5) 
    digit = 7
  end
  return p switch_digit(num/10, array) * 10 + digit
end

p "returned value = " + switch_digit(123456789, Array.new).to_s

哪个输出:

#=> [[9, 123456789], [8, 12345678], [7, 1234567], [6, 123456], [5, 12345], [4, 1234], [3, 123], [2, 12], [1, 1], 0]
#=> The end
#=> 1
#=> 12
#=> 123
#=> 1234
#=> 12347
#=> 123476
#=> 1234767
#=> 12347678
#=> 123476789
#=> "returned value = 123476789"