Member 13463719 Ответов: 2

Лукас вопрос как сделать вывод ответа как 2, 1, 3, 4, 7, 11.....


w_lucas = Block
 [
     VarDecl "a" (Val (VInt 2)),
     VarDecl "b" (Val (VInt 1)),
     VarDecl "c" (Val (VInt 0)),
	 VarDecl "i" (Val (VInt 2)),
 
     If ( Equals (Var "arg") (Val (VInt 0)))
	 ( Block [ Assign "result" (Val (VInt 2))])
	 
	  ( Assign "result" (Val (VInt 2)) ),

     While ( LessOrEq (Var "i")(Var "arg"))
     ( Block
	  [ Assign "c" (Plus (Var "a") (Var "b")),
         Assign "a" (Var "b"),
         Assign "b" (Var "c"),
         Assign "i" (Plus (Var "i") (Val (VInt (1))))    
       ]
     ),

     Assign "result" (Var "b")
 ]

lucas :: Int -> Int
lucas n = let m = [ ("result", VInt (-1)), ("arg", VInt n)]
               in (asInt.fromJust) (lookup "result" (exec w_lucas m))


это мой код, выход 1,1,3,4,7,11......

Что я уже пробовал:

менять Вал на винт количества, но это не меняет вывода

Member 13463719

я скомпилировал код и запустил только вывод Лукас 0 должен возвращать 2 но он всегда возвращает 1

2 Ответов

Рейтинг:
2

OriginalGriff

Цитата:
я скомпилировал код и запустил только вывод Лукас 0 должен возвращать 2 но он всегда возвращает 1


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

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но к более ранним стадиям вы придете позже): тестирование и отладка.

Начните с рассмотрения того, что он делает и чем это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:
Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его-он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставьте точку останова в первой строке и запустите приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "шаг вперед" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он совершенствуется только при использовании!


Рейтинг:
2

Patrice T

Я не знаю Лукаса, но, похоже, вы забыли сказать своему коду, чтобы он остановился, как только вы установите результат на 0

If ( Equals (Var "arg") (Val (VInt 0)))
    ( Block [ Assign "result" (Val (VInt 2)),
              stop here])

Цитата:
я скомпилировал код и запустил только вывод Лукас 0 должен возвращать 2 но он всегда возвращает 1

Вот тогда-то и пригодится отладчик.
Отладчик-Википедия, свободная энциклопедия[^]