Как я могу посчитать, сколько функций было выполнено в этом коде? - PullRequest
0 голосов
/ 03 июля 2018

Я изучал Matlab для хобби. Это мой второй вопрос по переполнению стека.

В эти дни меня интересует судоку от Matlab. Я получил код из Интернета и изучаю этот код в течение 3 недель.

Я хочу добавить функцию, которая показывает, сколько раз выполнялась «подфункция (кандидатов)». -> Сколько раз функция работает для решения.

Раньше я использовал cnt = 0 и cnt = cnt + 1 для подсчета (в операторе if и while) но я понимаю, что структура этого кода является циклом (??) * я попробовал это, но cnt были сброшены при попытке, я думаю, я знаю причину сброса но я не могу написать это код

Спасибо за вашу помощь


function X = s2(X) 

% SUDOKU  Solve Sudoku using recursive backtracking. 
%   sudoku(X), expects a 9-by-9 array X. 
 % Fill in all ?singletons?. 
 % C is a cell array of candidate vectors for each cell. 
 % s is the first cell, if any, with one candidate. 
 % e is the first cell, if any, with no candidates. 
 [C,s,e] = candidates(X); 
 while ~isempty(s) && isempty(e) 
    X(s) = C{s}; 
    [C,s,e] = candidates(X); 
 end 
 % Return for impossible puzzles. 
 if ~isempty(e)

    return 
 end 
 % Recursive backtracking. 
 if any(X(:) == 0)


    Y = X; 
    z = find(X(:) == 0,1);    % The first unfilled cell. 
    for r = [C{z}]            % Iterate over candidates. 
       X = Y; 
       X(z) = r;              % Insert a tentative value. 
       X = s2(X);         % Recursive call. 
       if all(X(:) > 0)       % Found a solution. 
          return 
       end 
    end 

   end 
% ??????????????? 
   function [C,s,e] = candidates(X) 


      C = cell(9,9); 
      tri = @(k) 3*ceil(k/3-1) + (1:3); 
      for j = 1:9 
         for i = 1:9 
            if X(i,j)==0 
               z = 1:9; 
               z(nonzeros(X(i,:))) = 0; 
               z(nonzeros(X(:,j))) = 0; 
               z(nonzeros(X(tri(i),tri(j)))) = 0; 
               C{i,j} = nonzeros(z)'; 
            end 
         end 
      end 
 L = cellfun(@length,C);   % Number of candidates. 
 s = find(X==0 & L==1,1); 
 e = find(X==0 & L==0,1); 

 end % candidates 
end % s2

я использовал переменную X

X=[4 0  0   0   2   0   0   0   0;
0   1   0   3   0   0   5   0   0;
0   0   9   0   0   8   0   6   0;
7   0   0   6   0   0   1   0   0;
0   2   0   0   0   0   0   0   9;
0   0   3   0   0   4   0   0   0;
6   0   0   7   0   0   0   2   0;
0   8   0   0   1   0   0   0   4;
0   0   0   0   0   9   3   0   0];

1 Ответ

0 голосов
/ 03 июля 2018

Вы также можете использовать постоянную переменную, которая должна сохранять свое значение при нескольких вызовах функции.

Например:

function [ result ] = myfactorial( num )
    % using persistent variable based on 
    % https://www.mathworks.com/help/matlab/ref/persistent.html
    persistent numcalls;
    if isempty(numcalls)
        numcalls = 0;
    end
    numcalls = numcalls+1;
    disp(strcat('numcalls is now: ', int2str(numcalls)));
    % factorial function based on
    % https://www.quora.com/How-can-I-create-a-factorial-function-in-MATLAB
    if num > 1
        result = myfactorial(num-1)*num;
    else
        result = 1;
    end
end

Теперь вызовите функцию.

clear all;
result = myfactorial(5);

Вывод:
numcalls теперь: 1
numcalls теперь: 2
numcalls теперь: 3
numcalls теперь: 4
numcalls теперь: 5

...