SICP ممارسة 1.16، حيث هو بلدي علة، لأنه يبدو لي الحق في

StackOverflow https://stackoverflow.com/questions/1643518

  •  10-07-2019
  •  | 
  •  

سؤال

ولقد بدأت للتو العمل من خلال هذا الكتاب من أجل المتعة. كنت أتمنى أن يكون الواجبات المنزلية، ولكن أنا لا يمكن أن تحمل لحضور MIT، وهناك طن من الناس أكثر ذكاء من لي على أية حال. : p

ومن المفترض

وسريعة إكسب للعثور ب ^ ن، أي 4 ^ 2 = 16، 3 ^ 3 = 27

(define (fast-exp b n)
  (define (fast-exp-iter n-prime a)
    (cond ((= n-prime 1) a)
          ((= (remainder n-prime 2) 1) (fast-exp-iter (- n-prime 1) (* a b)))
          (else (fast-exp-iter (/ n-prime 2) (* a b b)))))
  (fast-exp-iter n 1))

fast-exp 4 2; Expected 16, Actual 2
هل كانت مفيدة؟

المحلول

وكنت قد نسيت للاتصال السريع إكسب. بدلا من ذلك، تقييم ثلاث ذرات منفصلة. لتقييم الواقع-إكسب سريع من 4 إلى 2، وكنت قد لكتابة

(fast-exp 4 2)

نصائح أخرى

والحل كنت قد كتبت هنا هو أيضا غير صحيح. مثلا تحقق من (سريع إكسب 2 6). المتوقع: 64، الفعلية: 32

والحل الخاص بك هو احتساب إجابات خاطئة. (راجع http://ideone.com/quT6A ) في الواقع، وكيف من حيث المبدأ يمكن أن يكتب الذيل عودي الأسي سريع يمر رقمين فقط كوسائط؟ أنا لا أعتقد أنه من الممكن حتى، لأنه في منتصف حساب كنت لا تعرف ما مضاعف لاستخدام إذا واجهتك الأس الغريب. ولكن أستطيع أن أعطي مثالا على العمل الحل هذا هو بالضبط ما هو متوقع من قبل المؤلفين SICP (عملية تكرارية باستخدام "كمية ثابتة" (أ * ب ^ ن)، حيث في البداية 1)

(define (pow x y)
  (define (powi acc x y)
    (cond
      ((= y 0) acc)
      ((odd? y) (powi (* acc x) x (- y 1)))
      (else (powi acc (* x x) (/ y 2)))))
  (powi 1 x y))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top