тактика мыслить как компьютер - PullRequest
0 голосов
/ 15 января 2011

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

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

Ответы [ 2 ]

3 голосов
/ 15 января 2011

Я бы использовал попытку "снизу вверх":

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!.

Это не полный анализ, например мы не знаем, в каком порядке будут выводиться символы, но это грубая схема того, что происходит - и, как вы и другие люди в комментариях указали, это то, что вы хотите - тактика вместо полного ответа.

1 голос
/ 15 января 2011

Что я, вероятно, должен сделать, это начать с функции main() в верхнем левом углу страницы, записать первую выполненную строку, отслеживать локальные переменные и т. Д., Затем написать следующую строку под ней и и так далее.

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

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

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

Эти шаги помогут вам справиться с большинством проблем «думай как компьютер».

...