sizeof
дает размер переменной, не размер объекта, на который Вы указываете (если существует тот.) sizeof(arrayVar)
возвратит размер массива в байтах, если и только если arrayVar
объявляется в объеме как массив и не указатель.
, Например:
char myArray[10];
char* myPtr = myArray;
printf("%d\n", sizeof(myArray)) // prints 10
printf("%d\n", sizeof(myPtr)); // prints 4 (on a 32-bit machine)
Well that, in the end, was rediculously easy to fix.
Here is the correct code.
ordered([]).
ordered([N, M|Ns]):-
append([M], Ns, Tail),
ordered(Tail),
N =< M.
ordered([M]).
ordered([M]). deals with the single-element list as described above.
The real root of my problem was not including [] around the M in the append function.
Whats the ettiquette regarding awarding the correct answer? You've both helped muchly.
Jon
(предполагая, что это домашнее задание, я не решаюсь дать полное решение).
Глядя на ваш код, попытайтесь выяснить, как он объединит ? - Order ([1 ]).
Выполните этот запрос мысленно (или используя trace / 0) и посмотрите, что он делает, шаг за шагом, и как вычисляет свой результат.
Кроме того, при продумывании пролога постарайтесь выкинуть из головы «возвращает значение». Предикаты Пролога ничего не возвращают.
Я думаю, что ваше решение не поддерживает хвостовую рекурсию. Подумайте что-нибудь подобное:
ordered([]) :-!.
ordered([_]):-!.
ordered([A,B|T]) :-
A =< B,
!,
ordered([B|T]).
Вы совершенно правы: согласно вашему коду существует только два возможных способа упорядочивания списка
:
Это, безусловно, правильные утверждения, но как насчет списка [3]
? Разве это не заказано и
? Очевидно, что список только с одним элементом упорядочен, но у вас нет возможности выразить это: он не подходит ни для вашего базового случая, ни для вашего рекурсивного случая.
Одноэлементный список - это еще один случай, скрытый здесь, который вы еще не рассмотрели . Поскольку это не зависит от двух правил, которые вы уже определили, вы можете рассмотреть способ отдельно рассмотреть этот особый случай.