我有这种方法,将数字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吗?
这种递归方法实际上如何工作?它是否将返回的数字附加到下一个数字?
答案 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"