Тактика мыслить как компьютер

У меня есть вопрос из экзамена, в котором мне нужно вывести вывод следующего кода:

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() функция в верхнем левом углу страницы, запишите первую выполненную строку, отслеживая локальные переменные и т. д., затем запишите следующую строку под ней и так далее.

Но когда вызывается функция, также двигайтесь вправо на один столбец, записывая имя функции и фактическое значение входных аргументов для этого вызова, а затем продолжая строки в этой функции.

Когда вы вернетесь из функции, переместитесь влево и запишите возвращаемое значение между двумя столбцами.

Кроме того, оставьте отдельную область для "стандартного вывода", куда идет весь напечатанный текст.

Эти шаги должны помочь вам преодолеть большинство проблем "думай как компьютер".

Другие вопросы по тегам