Тактика мыслить как компьютер
У меня есть вопрос из экзамена, в котором мне нужно вывести вывод следующего кода:
01 int foo(int a) {
02 print 'F';
03 if (a <= 1) return 1;
04 return bar(a, foo(a-1));
05 }
06
07 int bar(int x, int y) {
08 print 'B';
09 if (x > y) return baz(x, y);
10 return baz(y, x);
11 }
12
13 int baz(int x, int y) {
14 print 'Z'
15 if (y == 0) return 0;
16 return baz(x, y-1) + x;
17 }
18
19 void main() {
20 foo(3);
21 }
Мой вопрос: какая тактика будет наилучшей для решения такого рода вопросов? Мне не разрешено использовать ПК, конечно. PS Вы можете использовать энергичную оценку, как в с ++, или оценку нормального порядка (результат будет разным, конечно, но меня интересует только тактика), я пытался решить ее, используя стек, каждый время напиши функцию которую я вызываю, но все равно она сложная заранее спасибо за любую помощь
2 ответа
Я бы использовал попытку "снизу вверх":
baz
это функция, которая вызывается, но не вызывает другие функции (кроме себя). Точно выводит "Z" y + 1
раз, код возврата x*y
(вы добавляете x
после каждого звонка).
bar
"следующая более высокая" функция, она выводит "B" один раз и вызывает baz
с его нижним аргументом в качестве второго параметра - код возврата x*y
, тоже.
foo
это "верхняя" функция (сразу после main
) и его самая сложная функция. Он выводит "F" не только один раз, но a
раз (из-за foo(a-1)
в конце, который оценивается до bar
вызов. bar
умножение вызовов a
а также foo(a-1)
, который будет умножаться a-1
а также foo(a-2)
и так до тех пор, пока foo(1)
оценивается и возвращает 1. Таким образом, код возврата a * (a-1) * ... 2 * 1
, так a!
,
Это не полный анализ, например, мы не знаем, в каком порядке будут выводиться символы, но это грубая схема того, что происходит - и, как вы и другие люди в комментариях указали, это то, что вы хотите - тактика вместо полного ответа.
Что я, вероятно, сделаю, это начать с main()
функция в верхнем левом углу страницы, запишите первую выполненную строку, отслеживая локальные переменные и т. д., затем запишите следующую строку под ней и так далее.
Но когда вызывается функция, также двигайтесь вправо на один столбец, записывая имя функции и фактическое значение входных аргументов для этого вызова, а затем продолжая строки в этой функции.
Когда вы вернетесь из функции, переместитесь влево и запишите возвращаемое значение между двумя столбцами.
Кроме того, оставьте отдельную область для "стандартного вывода", куда идет весь напечатанный текст.
Эти шаги должны помочь вам преодолеть большинство проблем "думай как компьютер".